【发布时间】:2018-01-28 18:04:25
【问题描述】:
最近我在 Python 递归教程中看到了一些代码,它是一个基本的阶乘递归:
def factorial(n):
print("factorial has been called with n = " + str(n))
if n == 1:
return 1
else:
res = n * factorial(n-1)
print("intermediate result for ", n, " * factorial(" ,n-1, "): ",res)
return res
print(factorial(5))
这是控制台输出:
factorial has been called with n = 5
factorial has been called with n = 4
factorial has been called with n = 3
factorial has been called with n = 2
factorial has been called with n = 1
intermediate result for 2 * factorial( 1 ): 2
intermediate result for 3 * factorial( 2 ): 6
intermediate result for 4 * factorial( 3 ): 24
intermediate result for 5 * factorial( 4 ): 120
120
在做了一些研究之后,我觉得我理解了为什么这是输出,但我想确定一下。据我了解:
它重复 else 语句 4 次并将 n 值和 res 值放入调用堆栈。当 res 调用 factorial(1) 时,它会转到基本情况并停止递归,以便我们可以检索堆栈数据。它弹出 n =1 并且不打印任何输出,但随后弹出 2、3、4、5 并检索它们在递归期间计算的 res 值。最后,一旦 res 返回足够多,我们在堆栈顶部留下 5*24(n*res),Python 知道这是 print(factorial(5)) 的返回值。
这是所有正确的信息,我错过了什么吗?如果其中有任何不正确,请告诉我,或者指出一些可以澄清这一点的资源的方向。谢谢!
【问题讨论】: