ansheng’s blog!

修复Python递归超出最大深度

刚用Python写了一个递归小程序,功能主要是像函数(print_n(n))传入一个n值,然后输出1-n,例如下面的代码:

def print_n(n):
    if n:
        print_n(n - 1)
    print(n)

当我在ipython中进行调试的时候,N为10000时,会抛出RecursionError: maximum recursion depth exceeded的错误

In [1]: def print_n(n):
   ...:     if n:
   ...:         print_n(n - 1)
   ...:     print(n)
   ...:

In [2]: print_n(10000)
---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-2-085ca2d6a389> in <module>
----> 1 print_n(10000)

<ipython-input-1-ae5822a69b3f> in print_n(n)
      1 def print_n(n):
      2     if n:
----> 3         print_n(n - 1)
      4     print(n)
      5

... last 1 frames repeated, from the frame below ...

<ipython-input-1-ae5822a69b3f> in print_n(n)
      1 def print_n(n):
      2     if n:
----> 3         print_n(n - 1)
      4     print(n)
      5

RecursionError: maximum recursion depth exceeded

这其实是因为Python限制了递归的深度,可以用过sys.getrecursionlimit()查看限制的深度

In [3]: import sys

In [4]: sys.getrecursionlimit()
Out[4]: 3000

可以看到,默认的限制是3000,当然我们也可以修改这个限制,通过sys.setrecursionlimit方法

In [5]: sys.setrecursionlimit(20000)

In [6]: sys.getrecursionlimit()
Out[6]: 20000

这会将默认限制增加到20000,然后我们再次调用print_n函数

In [7]: print_n(10000)
...
10000

最终,解决了我们的问题。