无法理解Python 2.7中的阶乘的经典递归示例

我理解递归的概念,我感到困惑的是流量控制.我看到过这种方式有两种,一种是我得到的,另一种是我没有的.例一:

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

所以在这个例子中,如果我们运行fact(3),会发生以下情况:

fact(3) = 3*fact(3-1)`
fact(2) = 2*fact(2-1)
fact(1) = 1*fact(1-1)
fact(0) = 1

或组合:3 * 2 * 1 * 1 = 6

现在,对于下面的内容,我被绊倒的地方在于流量控制的工作原理.我在脑海中根深蒂固,当一个函数被调用时,其他一切都被暂停,直到该函数完成,此时程序返回到main.以下是我的大脑认为发生在下面的事情:

def factorial(n):
    if n == 0:
        return 1
    else:
        recurse = factorial(n-1)
        result = n * recurse
        return result

我们称之为factorial(3):

factorial(3)=factorial(2)=factorial(1)=factorial(0)=1

我认为这种情况发生的原因是因为结果是在调用之后分配的,并且在我看来代码永远不会到达,因为流控制在分配结果之前暂停main.我认为这个函数只是运行n == 0的测试,直到返回1然后程序退出.

帮助我理解为什么我似乎无法将这个概念化.

最佳答案 这是程序流程的概述.看起来可能有点令人困惑,但它可能会有所帮助.这里,不同的选项卡级别表示不同的堆栈,每一行是程序执行的命令.

factorial(3)
| factorial(2)
| | factorial(1)
| | | factorial(0)
| | |   RETURNS 1
| | recurse = 1
| | result = 1 * 1 [since n=1]
| | RETURNS 1 [returning result]
| recurse = 1 [catching returned result of 1]
| result = 2 * 1 [since n=2]
| RETURNS 2 [returning result]
recurse = 2 [catching returned result of 2]
result = 3 * 2 [since n=2]
RETURNS 6 [returning result]
点赞