递归实现阶乘问题专业讲解请求(已解决,助初学者学习)
递归实现阶乘的分步计算详解
先看阶乘的递归实现代码:
def fact(n): if n==1: return 1 else: return n*fact(n-1)
以n=5为例,分步拆解递归执行过程
递归的核心是先“递”下去拆解问题,再“归”回来合并结果,我们分两个阶段来看:
1. 递推阶段(拆解问题)
每次调用fact(n)时,只要n≠1,就会暂停当前函数的执行,转而调用fact(n-1),直到触发终止条件:
- 调用
fact(5):5≠1,执行return 5 * fact(4),暂停fact(5),进入fact(4) - 调用
fact(4):4≠1,执行return 4 * fact(3),暂停fact(4),进入fact(3) - 调用
fact(3):3≠1,执行return 3 * fact(2),暂停fact(3),进入fact(2) - 调用
fact(2):2≠1,执行return 2 * fact(1),暂停fact(2),进入fact(1) - 调用
fact(1):n==1,触发终止条件,直接返回1
2. 回溯阶段(计算并返回结果)
当底层的fact(1)返回后,之前暂停的函数会依次恢复执行,完成乘法运算并返回结果:
fact(2)拿到fact(1)返回的1,计算2*1=2,返回2给fact(3)fact(3)拿到fact(2)返回的2,计算3*2=6,返回6给fact(4)fact(4)拿到fact(3)返回的6,计算4*6=24,返回24给fact(5)fact(5)拿到fact(4)返回的24,计算5*24=120,最终返回120
关键知识点总结
- 终止条件:
if n==1: return 1是递归的核心,没有它会导致无限递归(函数一直调用自身直到栈溢出) - 调用栈机制:递归调用会被操作系统以栈的形式管理,每次新调用压栈,终止条件触发后开始出栈计算
- 运算时机:乘法操作都发生在回溯阶段,也就是从最底层的终止结果开始,逐层向上合并计算
内容的提问来源于stack exchange,提问作者Hakari Kinji
相关产品推荐
相关产品推荐

