在试图理解Python中的递归如何工作时,我编写了下面的函数,它在列表中搜索给定值。其思想是对列表进行排序,然后在ith和jth元素中找到中间索引,并与搜索值进行比较。问题是它进入了一个无限循环。我一步一步地运行了这些语句,得到了所需的结果。有人能指出我哪里说错了吗?
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):
...