昨晚执行一个Python递归程序,早上过来一看报错了:
Process finished with exit code -1073741571 (0xC00000FD)
查看问题的根源在于递归导致的栈溢出,环境windows10、python3.6-64bit。
1. 测试最大递归代数,代码:
<pre class="has">
import sys
sys.setrecursionlimit(100000)
def foo(n):
print(n,end=",")
n += 1
foo(n)
if name == 'main':
foo(1)
执行结果:
执行到1860或者3222左右报错,最大代数不稳定。
2. 按照网络教程nofollow">谁说Python不能尾递归优化,进行尾递归改造,代码:
<pre class="has">
import sys
import types
sys.setrecursionlimit(100000)
def foo(n):
print(n)
if n==100000:
yield 1
else:
n += 1
yield foo(n)
def tramp(gen,arg):
g = gen(arg)
while isinstance(g,types.GeneratorType):
g=g.next()
return g
if name == 'main':
tramp(foo,0)
执行结果:
成功!