【问题标题】:python recursive function loops infinitely [duplicate]python递归函数无限循环[重复]
【发布时间】:2021-12-06 09:11:26
【问题描述】:

在尝试了解递归在 Python 中的工作原理时,我编写了以下函数,该函数在列表中搜索给定值。这个想法是对列表进行排序,然后在第 ij 个元素中找到中间索引,并与搜索值进行比较。 问题是它进入了一个无限循环。我已逐步运行语句并获得所需的结果。谁能指出我哪里弄错了?

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

【问题讨论】:

  • searchbsearch 应该是同一个函数吗?
  • 您正在更新 ij 但它们没有被传递到函数调用中?
  • if not('i' in locals()) and not('j' in locals()) 应该做什么?那些局部变量永远不会在函数中存在。
  • if 将始终为 True,因为每个函数调用都有自己的名称范围。您必须传递值才能实际检查它们
  • 使用调试器单步执行代码并查看会发生什么非常容易。如果你这样做了,你就不需要问这个问题了。使用递归链接到工作解决方案的引用;将范围索引作为参数传递。

标签: python function recursion


【解决方案1】:

您的问题是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):
    ...

【讨论】:

  • 我试图使它成为一个只有两个参数的更简单的形式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2021-01-16
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多