我编写了以下函数以实现我自己的二进制搜索
def bisect(input, target):
mid = len(input)/ 2
if len(input) == 1:
if input[0] == target:
return 1
else:
return None
elif input[mid] > target:
bisect(input[:mid], target)
elif input[mid] <= target:
bisect(input[mid:], target)
我知道我的实现已经关闭,但是我更了解这里的递归堆栈。
当我致电bisect(['d','e'], 'd')
时,我的函数应该返回
bisect(['d'], 'd')
但是它返回None。此外,当我直接调用bisect(['d'], 'd')
时,我得到正确的值0.这怎么可能?
答案 0 :(得分:4)
您忽略了递归调用的返回值。您还需要显式地返回这些内容:
elif input[mid] > target:
return bisect(input[:mid], target)
elif input[mid] <= target:
return bisect(input[mid:], target)
递归调用就像任何其他函数调用一样;他们将结果返回给调用者。如果忽略返回值并且调用函数结束,则最终使用该调用函数,然后返回None
。