所以我正在编写一个递归函数,用二进制搜索算法确定列表中的整数成员资格,一旦函数完成递归,我就无法返回/打印一个值。说实话,我很难绕递归。每当我运行程序时,它会无限地输出一半错误消息。我的问题似乎是,如果该项目应该通过递归测试失败,它实际上不知道何时停止失败,它只是继续打印失败的条件/出现的错误消息。
程序必须在完成运行后打印出条件,这样如果我说is_member(list_of_numbers,83),如果它在列表中,它将打印“True”。
这是我工作几个小时后的代码。
def is_member(set, number):
if len(set) == 0:
print(False)
else:
midpoint = len(set) // 2
#print(midpoint)
if set[midpoint] == number:
print(True)
else:
if number < set[midpoint]:
if is_member(set[:midpoint], number) == True:
print(True)
elif number > set[midpoint]:
if is_member(set[:midpoint+1:], number) == True:
print(True)
else:
print(False)
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
is_member(testlist, 3)
is_member(testlist, 19)
答案 0 :(得分:0)
由于以下情况,您当前的递归程序无法运行 -
if is_member(set[:midpoint+1:], number) == True:
即使midpoint
为0
,也会将is_member()
切换为set
切换为 - set[:1:]
- 这将是{set
中的第一个元素1}}列表。因此,这将继续下去。条件应该是 -
if is_member(set[midpoint+1:], number) == True:
这样您就可以检查midpoint
的右侧。
鉴于此,要转换程序以返回结果,您应该返回结果而不是print
。示例 -
def is_member(set, number):
if len(set) == 0:
return False
midpoint = len(set) // 2
if set[midpoint] == number:
return True
if number < set[midpoint]:
return is_member(set[:midpoint], number)
elif number > set[midpoint]:
return is_member(set[midpoint+1:], number)
return False
演示 -
>>> def is_member(set, number):
... if len(set) == 0:
... return False
... midpoint = len(set) // 2
... if set[midpoint] == number:
... return True
... if number < set[midpoint]:
... return is_member(set[:midpoint], number)
... elif number > set[midpoint]:
... return is_member(set[midpoint+1:], number)
... return False
...
>>> testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
>>>
>>> is_member(testlist, 3)
False
>>> is_member(testlist, 19)
True
>>> is_member(testlist, 100)
False
>>> is_member(testlist, 42)
True