python - python递归函数无限循环
问题描述
在尝试了解递归在 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
解决方案
您的问题是locals
,您正在使用它的函数是本地的。每次调用该函数(递归或以其他方式)时,都会创建一个新的变量命名空间,因此locals
将始终为空。参见例如:
def foo():
x = 1
print("foo locals:", locals())
bar()
def bar():
y = 2
print("bar locals:", locals())
foo()
其输出将是:
foo locals: {'x': 1}
bar locals: {'y': 2}
您需要传递要在函数调用之间使用的任何变量,例如i
和j
作为参数:
def bsearch(search_list, value, i, j):
...
推荐阅读
- swift - 自定义 NSButton 未按预期显示
- python - 您将如何使用 IF NOT 语句,但有 2 个选项
- git - `git stash show` 的输出为空
- css - 我们应该如何使用不同的谷歌字体?
- java - 我映射不正确的是什么?“字段列表”中的未知列
- r - 对 R 闪亮的 dateRangeInput 使用相同的最小/最大日期和开始/结束日期
- javascript - 如何将基于 require.js 的脚本作为组件包含到 Angular 中
- android - 为什么android studio用红色显示这个项目
- javascript - 清除框字段时如何删除无结果消息
- c - 快速,绘制数据集_如何计算绘图的线数