为什么递归函数fact(n)少个return会报错?

def fact(n):
    if n==1:
        return 1
    n*fact(n-1)


else_if
浏览 2007回答 4
4回答

清波

首先贴出报错信息: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 类型, 传进去就可以改变递归的最大深度了。不建议这么做,如果一个问题需要突破递归深度才能解决,那么递归也许就不是这个问题的最优解了, 建议用其他方式解决问题,而不是轻易改变递归深度。

weibo_曦禅_03461137

这两个的报错是不一样的,一个没有返回值,一个是超出最大限制了。

else_if

这个函数为什么不会无限递归下去?def move(n, a, b, c):    if n==1:        print a,'-->',c        return     move(n-1,a,c,b)

weibo_曦禅_03461137

也不一定会报错,我调试了,如果没有return,就没有返回值,函数运行的结果就是空值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python