如何解决Python中二进制搜索的递归方法
我现在正在学习算法,并对二进制搜索的递归方法有疑问。我试图自己编写如下代码:
def binary_search_rec(x,value):
x.sort()
length = len(x)
if length == 1 and x[0] == value:
return 0
elif length == 1 and x[0] != value:
return 'none'
else:
low = 0
high = length - 1
mid = (low + high)//2
if value == x[mid]:
return mid
elif value > x[mid]:
return mid + binary_search_rec(x[mid+1:],value)
else:
return binary_search_rec(x[0:mid],value)
基本情况是具有单个元素的数组。但是,我无法通过玩具数据收到正确的结果:
binary_search_rec([1,2,3,4],3)
这将返回1
。
请您帮我弄清楚我做错了什么吗?预先感谢您的帮助。
解决方法
如果要使用递归方法返回找到的号码的索引,则需要跟踪相对于初始列表的索引。将切片传递回递归将返回相对于该切片的索引,这不是正确的答案。一种更简单的方法是将低值和高值与原始列表(而不是切片)一起传递到递归中。您可以使用默认值来处理它,这样就不会给调用者带来负担。因为您不会在每次递归调用时都分配列表切片的新副本,所以这将更容易推理,并且更快。例如:
def binary_search_rec(x,value,low = 0,high = None):
if high is None:
high = len(x)
# edge case -- we didn't find it
if high <= low :
return 'none'
# the mid is relative to the whole list,so add low to it
mid = (high - low) // 2 + low
if value == x[mid]:
return mid
elif value > x[mid]:
return binary_search_rec(x,mid + 1,high)
else:
return binary_search_rec(x,low,mid)
for i in range(8):
print(binary_search_rec([1,2,3,4,5,6],i))
打印:
none
0
1
2
3
4
5
none
此外,如果要返回索引,则对输入进行排序没有意义-您应该期望调用方传递经过排序的输入。如果呼叫者通过binary_search_rec([3,1],1)
并返回0
,因为这是排序列表的索引,那么它对呼叫者实际上没有帮助。
根据您的代码,此代码可能会对您有所帮助,我进行了一些修改。
def binary_search_rec(x,value):
x.sort()
length = len(x)
if length==0 or length ==None:
return -float('inf')
elif length == 1 and x[0] == value:
return 0
elif length == 1 and x[0] != value:
return -float('inf')
else:
low = 0
high = length - 1
mid = (low + (high-low))//2
if value == x[mid]:
return mid
elif value > x[mid]:
return mid + 1 + binary_search_rec(x[mid+1:],value)
else:
return binary_search_rec(x[0:mid+1],value)
print(binary_search_rec([1,5],3))
输出:2(索引)
'none'字符串返回不是一个好主意,而不是返回'none',您可能会返回inf值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。