二分法查找递归形式编写二分法查找
递归的方式编写简单的二分法查找函数得到值得索引,使用二分法源数据必须是有序的。
def func(n, left, right):
mid = (left+right)//2
print('函数又调用了一次')
if right >= left:
if L[mid] > n:
right = mid - 1
func(n,left,right)
if L[mid] < n:
left = mid + 1
func(n,left,right)
if L[mid] == n:
print('找到了')
return mid
else:
print('没有找到')
return -1
L = [11,22,33,44,55,66,77,88,99]
print(func(33,0,len(L)-1))
"""结果
函数又调用了一次
函数又调用了一次
函数又调用了一次
找到了
None
"""
猜测下上面的代码最后打印值应该是什么? 结果是None。这就是使用递归想要获取返回值的坑,上面的33的索引应该是2,我们想要的也是2,代码没有任何地方写返回None,但是结果却是None.这是因为,2是第三次调用函数是的到的返回值,这个返回值返回给了调用它的地方,也就是上面函数体里面调用它本身的地方,我们并没有接收这个值,所以最终返回值仍然是None.想要得到2需要修改代码如下,将内层调用的函数返回值作为上层函数的返回值再次return。
def func(n, left, right):
mid = (left+right)//2
print('函数又调用了一次')
if right >= left:
if L[mid] > n:
right = mid - 1
return func(n,left,right) #重点
if L[mid] < n:
left = mid + 1
return func(n,left,right) #重点
if L[mid] == n:
print('找到了')
return mid
else:
print('没有找到')
return -1
L = [11,22,33,44,55,66,77,88,99]
print(func(33,0,len(L)-1))
"""结果
函数又调用了一次
函数又调用了一次
函数又调用了一次
找到了
2
"""