【发布时间】:2021-12-06 09:11:26
【问题描述】:
在尝试了解递归在 Python 中的工作原理时,我编写了以下函数,该函数在列表中搜索给定值。这个想法是对列表进行排序,然后在第 i 和 j 个元素中找到中间索引,并与搜索值进行比较。 问题是它进入了一个无限循环。我已逐步运行语句并获得所需的结果。谁能指出我哪里弄错了?
def search(lst, v):
if not('i' in locals()) and not('j' in locals()):
i = 0
j = len(lst)
# sort
lst.sort()
midindex = i + int((j - i)/2)
if lst[midindex] > v:
j = midindex-1
return search(lst, v)
elif lst[midindex] < v:
i = midindex+1
return search(lst, v)
else:
return midindex
【问题讨论】:
-
search和bsearch应该是同一个函数吗? -
您正在更新
i和j但它们没有被传递到函数调用中? -
if not('i' in locals()) and not('j' in locals())应该做什么?那些局部变量永远不会在函数中存在。 -
if将始终为 True,因为每个函数调用都有自己的名称范围。您必须传递值才能实际检查它们 -
使用调试器单步执行代码并查看会发生什么非常容易。如果你这样做了,你就不需要问这个问题了。使用递归链接到工作解决方案的引用;将范围索引作为参数传递。