二进制搜索迭代和递归元组(python)
我正在尝试创建一个二进制搜索,包括迭代搜索和递归搜索,参数为tuple,int。我真的很想了解它,因为我认为我在逻辑上理解了代码,但显然不是这样 迭代代码isMemberI在一半的时间里给出了正确的结果,然后随机地给出了错误的结果,所以我不知道是什么导致了这种情况。我没有错,只是有时候回答错了 递归代码有时会给我错误,然后在我的测试用例中可能有¼个可以工作。当我尝试以下操作时,会出现以下错误:二进制搜索迭代和递归元组(python),python,recursion,binary-search,Python,Recursion,Binary Search,我正在尝试创建一个二进制搜索,包括迭代搜索和递归搜索,参数为tuple,int。我真的很想了解它,因为我认为我在逻辑上理解了代码,但显然不是这样 迭代代码isMemberI在一半的时间里给出了正确的结果,然后随机地给出了错误的结果,所以我不知道是什么导致了这种情况。我没有错,只是有时候回答错了 递归代码有时会给我错误,然后在我的测试用例中可能有¼个可以工作。当我尝试以下操作时,会出现以下错误: >>> isMemberR((1, 2, 3, 3, 4), 4 Traceback
>>> isMemberR((1, 2, 3, 3, 4), 4
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
isMemberR((1, 2, 3, 3, 4), 4)
File "/Users/alyssakelley/Documents/p93_binsearch.py", line 127, in isMemberR
return isMemberR(aseq[midpoint + 1], target)
File "/Users/alyssakelley/Documents/p93_binsearch.py", line 117, in isMemberR
if len(aseq) == 0:
TypeError: object of type 'int' has no len()
>>> isMemberR('aeiou', 'y')
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
isMemberR('aeiou', 'y')
File "/Users/alyssakelley/Documents/p93_binsearch.py", line 127, in isMemberR
return isMemberR(aseq[midpoint + 1], target)
File "/Users/alyssakelley/Documents/p93_binsearch.py", line 127, in isMemberR
return isMemberR(aseq[midpoint + 1], target)
IndexError: string index out of range
>>> isMemberR((1, 3, 5, 7), 4)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
isMemberR((1, 3, 5, 7), 4)
File "/Users/alyssakelley/Documents/p93_binsearch.py", line 125, in isMemberR
return isMemberR(aseq[:midpoint], target)
File "/Users/alyssakelley/Documents/p93_binsearch.py", line 127, in isMemberR
return isMemberR(aseq[midpoint + 1], target)
IndexError: tuple index out of range
这里最后一个函数调用是在索引中点+1处传递一个值,而不是元组 错误解释 索引器错误:元组索引超出范围,当元组的len为1且中点+1为1时会发生这种情况,因为只有一个元素超出范围 TypeError:“int”类型的对象没有len,这是在最后一行将int作为第一个参数传递给IsMember时
isMemberRaseq[Middpoint+1]中的aseq[Middpoint+1]是否为目标ASEQUE?不是,太棒了!!谢谢你解释:D
def isMemberI(aseq, target):
first = 0
last = len(aseq) - 1
found = False
while first < last:
midpoint = (first + last) // 2
if aseq[midpoint] == target:
found = True
else:
if target < aseq[midpoint]:
last = midpoint - 1
else:
first = midpoint + 1
return found
def isMemberR(aseq, target):
if len(aseq) == 0:
return False
else:
midpoint = len(aseq) // 2
if aseq[midpoint] == target:
return True
else:
if target < aseq[midpoint]:
return isMemberR(aseq[:midpoint], target)
else:
return isMemberR(aseq[midpoint + 1], target)
>>> isMemberI((1, 2, 3, 3, 4), 4)
True
>>> isMemberI((1, 2, 3, 3, 4), 2)
True
>>> isMemberI('aeiou', 'i')
True
>>> isMemberI('aeiou', 'y')
False
>>> isMemberI((1, 3, 5, 7), 4)
False
>>> isMemberI((23, 24, 25, 26, 27), 5)
False
>>> isMemberI((0, 1, 4, 5, 6, 8), 4)
True
>>> isMemberI((0, 1, 2, 3, 4, 5, 6), 3)
True
>>> isMemberI((1, 3), 1)
True
>>> isMemberI((2, 10), 10)
True
>>> isMemberI((99, 100), 101)
False
>>> isMemberI((42,), 42)
True
>>> isMemberI((43,), 44)
False
>>> isMemberI((), 99)
False
'''
def isMemberR(aseq, target):
if len(aseq) == 0:
return False
else:
midpoint = len(aseq) // 2
if aseq[midpoint] == target:
return True
else:
if target < aseq[midpoint]:
return isMemberR(aseq[:midpoint], target)
else:
return isMemberR(aseq[midpoint+1:], target)