I am new to python and programming in general. I have written a function which will search adjoining elements in an array and look for ones with values within 0.05 of each other much like a floodfill algorithm does. The only difference is I am doing something stupid when it comes to counting how many time the function is run (which I am thinking will also tell me how many elements I found), so my counter values are wrong. The code works when it comes to finding adjoining elements within 0.05 of each other, just the counting is funny.
def floodcount (x,y,array,value,count=0): #akin to a bucket fill in paint, finds the area instead
nrows = len(array)-1 #rows of the image
ncols = len(array[0])-1 #columns of the image
diff = array[x][y] - value
if (diff < 0.00) or (diff > 0.05): # the base case, finding a diff more than 0.05 or less than 0 is like finding a boundary
return 0
count = count +1
print 'count1 ',count
array[x][y] = -5 # so we do no calculate this pixel again
#print "[",x,",",y,"]"
if x > 0:
#print '1'# if not the first elemnet then can go back, this makes sure that x is within the array all the time
floodcount (x-1,y,array,value,count)
if y > 0:
#print '2'
floodcount (x,y-1,array,value,count)
if x < nrows:
#print '3'
floodcount (x+1,y,array,value,count)
if y < ncols:
#print '4'
floodcount (x,y+1,array,value,count)
if x > 0 and y > 0:
#print '5'
floodcount (x-1,y-1,array,value,count)
if x < nrows and y < ncols:
#print '6'
floodcount (x+1,y+1,array,value,count)
if x <nrows and y > 0:
#print '7'
floodcount (x+1,y-1,array,value,count)
if x > 0 and y < ncols:
#print '8'
floodcount (x-1,y+1,array,value,count)
print 'count2 ',count
return count
So for a test case
array = [[5,1,1,3,4],[4,5,6,2,5],[5,8,5,5,9]]
x=0 and y=0
OUTPUT
count1 1
count1 2
count1 3
count1 4
count1 5
count2 5
count2 4
count2 3
count1 3
count2 3
count2 2
count2 1
As you can see something is fishy 😛
Can anyone point out what I am doing wrong? Any help would be appreciated.
In addition to the now solved count problem:
You can reduce the number of
ifstatements by doing all recursive calls everytime and just checking the array borders at the beginning of the function withif x < 0 or y < 0 or x > nrows or y > ncols.