4 回答
TA贡献165条经验 获得超90个赞
首先贴出报错信息:
RecursionError: maximum recursion depth exceeded
递归错误:超出最大递归深度
好,这说明两个问题,其一 Python 对递归的深度有限制, 其二 这个函数超出了这个限度。
先说下后者吧,为什么去掉 return 之后会 使这个函数超出了 Python 的最大递归深度呢, 这是因为 return 有两个属性:
1 返回值,2 结束函数执行。 如果去掉了 return 这个递归函数就会无限递归下去,大致执行效果如下:
fact(5) ## 没有去掉 return 时: fact(5) = 5 * fact(4) fact(5) = 5 * 4 * fact(3) fact(5) = 5 * 4 * 3 * fact(2) fact(5) = 5 * 4 * 3 * 2 * fact(1) fact(5) = 5 * 4 * 3 * 2 * 1 ## 此时fact函数判断出参数为1 直接return 1 并且退出了函数,也就是打断了递归。 ## 去掉 return 时: fact(5) = 5 * fact(4) fact(5) = 5 * 4 * fact(3) fact(5) = 5 * 4 * 3 * fact(2) fact(5) = 5 * 4 * 3 * 2 * fact(1) fact(5) = 5 * 4 * 3 * 2 * 1 * fact(-1) #这里是关键,去掉了return,致使参数无限的递减下去而不终结 fact(5) = 5 * 4 * 3 * 2 * 1 * -1 * fact(-2) . . . fact(5) = 5 * 4 * 3 * 2 * 1 * -1 * ... * -n * fact(-n-1) . . . ## 所以最终就突破了 最大递归深度。
现在我们说下, Python 对递归深度的限制, 一般来说是 1000, 好像也有人说 是 997 什么的,大概就在这个范围。
那么为什么Python 会对递归 这个 看起来特别强大的 解决问题的思想加以限制呢?
这就要说到, Python 中递归的原理了,简单来说就是每一次递归都建立一个函数,也就是说在内存中 占用一块地址,如果不加以限制的话, 就会导致 内存溢出,这时候程序 就会报错了, 所以Python 对递归的深度加以限制。
Python 也给出了 改变这个限制的方法:
import sys sys.setrecursionlimit(depth) ## depth 为int 类型, 传进去就可以改变递归的最大深度了。
不建议这么做,如果一个问题需要突破递归深度才能解决,那么递归也许就不是这个问题的最优解了, 建议用其他方式解决问题,而不是轻易改变递归深度。
TA贡献2条经验 获得超0个赞
这个函数为什么不会无限递归下去?
def move(n, a, b, c):
if n==1:
print a,'-->',c
return
move(n-1,a,c,b)
添加回答
举报