递归 - Python 返回值问题

4 投票
5 回答
2205 浏览
提问于 2025-04-15 15:15

我知道这听起来可能是个傻问题,但我上次编程还是用汇编语言,所以我的思路可能有点偏差:

这是一个递归函数:

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

我想知道,当函数到达 n == 0 时,为什么它不是返回 1,而是返回阶乘的结果。我在想,如果是用汇编语言的话,应该是当 n == 0 的时候:

mov eax, 1
ret

上面的代码为什么能工作?我想,Python 是不是在这个条件之前返回了栈上的最后一个值?

5 个回答

0

如果你调用 fac(0),它会返回 1(不是 0,我想这只是你问题中的一个小错误)。如果你调用 fac(1),它会进入一个“否则”的部分,然后会调用 fac(0)。这时会返回 1。接着它会计算 n*1,也就是 1,然后返回这个值。如果你调用 fac(2),它同样会进入“否则”的部分,接着会调用 fac(1),正如上面提到的,它会返回 1,所以 n*fac(n-1) 就是 2,这就是 fac(2) 的返回值。以此类推。我希望这样能帮你理解。

1

当 n 等于 0 时,它确实会返回 1。这个返回值会从调用它的地方取出来,也就是在 n * fac(n - 1) 这个地方。这个 1 会和 n 相乘,然后再返回,依此类推。

12

想象一下,比如说我们要计算 fac(5)

return 5 * fac(4)
           return 4 * fac(3)
                      return 3 * fac(2)
                                 return 2 * fac(1)
                                            return 1 * fac(0)
                                                       1

在这个过程中,1 会是第一个返回的值,但它会被返回给 fac(1),然后 fac(1) 又会返回给 fac(2),依此类推。

撰写回答