如何清除python递归?

时间:2017-08-20 12:22:45

标签: python-2.7 recursion

我对python很新,并且几乎没有关于递归错误的问题:“RuntimeError:超出了最大递归深度”。 我知道这个错误是在python中避免堆栈溢出。 现在我已经制作了示例代码:

    $result = sqlsrv_query($conn,$sql);
    $row = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC);
    print_r(($row['uniname1'])); exit;

现在如果将递归限制设置为11,则代码将运行,不会出现错误。 输出:

import sys

def print1():
    print("1")
    return print2()

def print2():
    print("2")
    return print3()
------------- 
def print3() - def print7() <- (wrote here like this to save some place)
-------------
def print8():
    print("8")
    return print9()

def print9():
    print("9")

def main():
    sys.setrecursionlimit(11)
    print sys.getrecursionlimit()
    print1()

if __name__ == "__main__":
    main()

如果我将递归限制设置为10,则会出现错误:

11
1
2
3
4
5
6
7
8
9

我的问题是,是否有任何解决方案可以清除递归或其他解决方案,如何编写与此类似的代码,其中一个函数调用另一个函数,并且不需要最后一个函数,其中调用当前函数。 例如,我可以清除print2()处的递归,并以递归限制为10运行代码。 我想写一个代码,其中总是函数调用另一个函数,所以为了节省RAM我想我需要一些替代或其他解决方案。 代码也可以多次调用相同的函数。所以后来可能会运行3个不同的相同功能块,这就是我想要避免的。

1 个答案:

答案 0 :(得分:2)

创建一个循环,调用你返回的任何thunk:

def main():
  toDo = print1
  while toDo:
    toDo = toDo()

print1在不调用的情况下返回下一个调用的内容:

def print1():
  print("1")
  return print2

它唯一需要停止的是返回False而不是下一个要调用的函数。

每次通话都会倒回堆栈,永不累积。