问题描述
因此,我正在编写一个递归函数,以使用二进制搜索算法确定列表中整数的隶属关系,并且一旦函数完成其递归,就很难返回/打印一个值。 老实说,我很难绕过递归。 每当我运行程序时,它都会无限次输出错误消息的一半。 我的问题似乎是,如果该项目未通过递归测试,则它并不真正知道何时停止失败,而只是继续打印失败情况/出现的错误消息。
程序一旦完成运行就必须打印出条件,因此如果我说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)
1楼
由于以下情况,您当前的递归程序无法运行-
if is_member(set[:midpoint+1:], number) == True:
即使midpoint
为0
,它也会调用is_member()
并将set
切片设为is_member()
set[:1:]
-这将是set
列表中的第一个元素。
因此,这将继续下去。
条件确实是-
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