二分查找递归返回无
Posted
技术标签:
【中文标题】二分查找递归返回无【英文标题】:binary search recursive returns none 【发布时间】:2020-10-26 00:50:35 【问题描述】:我试图在 python 中编写二进制搜索。我写的是:
arr = [6, 13, 14, 25, 33, 43, 51, 53, 64, 72, 84, 93, 95, 96, 97]
def binarySearch(arr, low, high, key):
if(low <= high):
mid = (low + high) // 2
if(arr[mid] == key):
return key
elif(arr[mid] > key):
binarySearch(arr, low, mid - 1, key)
else:
binarySearch(arr, mid + 1, high, key)
else:
return -1
i = binarySearch(arr, 0, len(arr) - 1, 33)
print(i)
它返回无。然后我发现我没有在递归调用的开头放置 return 语句。但在我看来,如果没有返回语句,它无论如何都应该返回密钥,因为它首先控制它是否与密钥匹配。为什么函数找到键后继续执行并返回None而不是键。
【问题讨论】:
你真正想做的是返回函数,例如做return binarySearch(arguments)
而不是简单的binarySearch()
【参考方案1】:
它不会返回,因为您没有要求它返回。但是,我猜如果您确实放入了 return 语句,它仍然会返回错误的东西 - 键,与键所在的索引(您知道键是什么,为什么要进行计算以返回吗?)
【讨论】:
是的,我应该返回键的索引。不修复它是我的坏事。我的意思是,它不应该在 --- if(arr[mid] == key): return key --- 这行被执行时终止函数吗?【参考方案2】:这是您可能会考虑的二进制搜索的非递归变体。
def binary_search(arr, x):
# Time O(log n)
# Space O(1)
left = 0; right = len(arr) - 1
while left <= right:
mid = (left + right) // 2
if x > arr[mid]:
left = mid + 1
elif x < arr[mid]:
right = mid - 1
else:
return mid
return False
【讨论】:
【参考方案3】:arr = [6, 13, 14, 25, 33, 43, 51, 53, 64, 72, 84, 93, 95, 96, 97]
def binarySearch(arr, low, high, key):
if(low <= high):
mid = (low + high) // 2
if(arr[mid] == key):
return key
elif(arr[mid] > key):
return binarySearch(arr, low, mid - 1, key)
else:
return binarySearch(arr, mid + 1, high, key)
else:
return -1
i = binarySearch(arr, 0, len(arr) - 1, 33)
print(i)
【讨论】:
以上是关于二分查找递归返回无的主要内容,如果未能解决你的问题,请参考以下文章