首页 > 解决方案 > 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

标签: pythonfunctionrecursion

解决方案


您的问题是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}

您需要传递要在函数调用之间使用的任何变量,例如ij作为参数:

def bsearch(search_list, value, i, j):
    ...

推荐阅读