python3.5.4python
递归函数最恶心的时候莫非栈溢出(Stack overflow)。
PS:另外不少人在学习Python的过程当中,每每由于没有好的教程或者没人指导从而致使本身容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数字的谐音)转换下能够找到了,里面有最新Python教程项目可拿,不懂的问题多跟里面的人交流,都会解决哦!编程
如何解决?网络
人为设置递归深度
使用python写的递归程序若是递归太深, 那么极有可能由于超过系统默认的递归深度限制而出现错误。通常默认递归长度在1000左右。
RuntimeError: maximum recursion depth exceeded in comparison编程语言
显然此时咱们能够人为修改函数
import sys
sys.setrecursionlimit(1000000) #括号中的值为递归深度
尾递归优化
注:这只是一种思惟的科普
解决递归调用栈溢出的另外一种方法是经过尾递归优化,事实上尾递归和循环的效果是同样的,因此,把循环当作是一种特殊的尾递归函数也是能够的。学习
尾递归是指,在函数返回的时候,调用自身自己,而且,return语句不能包含表达式。这样,编译器或者解释器就能够把尾递归作优化,使递归自己不管调用多少次,都只占用一个栈帧,不会出现栈溢出的状况。优化
上面的fact(n)函数因为return n * fact(n - 1)引入了乘法表达式,因此就不是尾递归了。要改为尾递归方式,须要多一点代码,主要是要把每一步的乘积传入到递归函数中:blog
def fact(n):
return fact_iter(n, 1)教程
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)
能够看到,return fact_iter(num - 1, num * product) 仅返回递归函数自己,num - 1和num * product在函数调用前就会被计算,不影响函数调用。递归
fact(5)对应的fact_iter(5, 1)的调用以下:
===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120
尾递归调用时,若是作了优化,栈不会增加,所以,不管多少次调用也不会致使栈溢出。
遗憾的是,大多数编程语言没有针对尾递归作优化,Python解释器也没有作优化,因此,即便把上面的fact(n)函数改为尾递归方式,也会致使栈溢出。
Python标准的解释器没有针对尾递归作优化,任何递归函数都存在栈溢出的问题
小结方法一:人为修改默认递归长度 方法二:人为修改python解释器,将其优化,会十分有趣———PS:另外不少人在学习Python的过程当中,每每由于没有好的教程或者没人指导从而致使本身容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数字的谐音)转换下能够找到了,里面有最新Python教程项目可拿,不懂的问题多跟里面的人交流,都会解决哦!本文的文字及图片来源于网络加上本身的想法,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理。