递归 - Python 返回值问题
我知道这听起来可能是个傻问题,但我上次编程还是用汇编语言,所以我的思路可能有点偏差:
这是一个递归函数:
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)
,依此类推。