【问题标题】:Need Some Clarification on Recursion需要对递归进行一些澄清
【发布时间】: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)) 的返回值。

这是所有正确的信息,我错过了什么吗?如果其中有任何不正确,请告诉我,或者指出一些可以澄清这一点的资源的方向。谢谢!

【问题讨论】:

    标签: python recursion


    【解决方案1】:

    是的,你是对的。

    注意factorial(n-1) 之前是如何被调用的

    print("intermediate result for ", n, " * factorial(" ,n-1, "): ",res)
    

    这就是为什么在“中间结果”打印之前首先收到"factorial has been called" 打印消息的原因。

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多