繁体   English   中英

递归 - Python,返回值问题

[英]Recursion - Python, return value question

我意识到这可能听起来像一个愚蠢的问题,但我最后一次编程它是在汇编程序,所以我的想法可能是关闭的:

递归函数如下:

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

为什么当函数达到n == 0时它不返回1而是返回因子。 我在思考类似于汇编程序的东西,当n == 0时:

mov eax, 1
ret

为什么上面的代码工作,我想python在那个条件之前返回堆栈的最后一个值?

想想这样,对于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) ,依此类推。

返回1,当n == 0,即返回值被弹出从调用站点,这是在所述调用栈n * fac(n - 1) 1乘以n并返回等。

如果你调用fac(0)它将返回1(不是0,但我想这只是你问题中的一个错字)。 如果你调用fac(1),它将进入else子句,并在那里调用fac(0) 这将返回1.然后它将计算n * 1,即1,然后返回。 如果你调用fac(2)它也会进入else子句,它将调用fac(1) ,如上所述将返回1,所以n*fac(n-1)将为2,这是返回值fac(2) 等等。 我希望能为你解释一下。

没有任何东西被隐含地返回 - 当n = 0时,函数进入if语句,并直接从return 1语句return 1 然而,这不是将“作为因子的答案”返回给用户的点。 相反,它可能会将此值返回到由fac(1)调用的调用函数,该调用函数位于n * fac(n - 1)分支的中间。 因此,将采取“1”返回,返回n*1 ,也就是1到它的调用者。 如果那是fac(2),它将返回n * 1或2给它的调用者,依此类推。

因此fac(5)被翻译成:

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

只有在通过每个上层返回1值之后,它才会返回到第一个调用者,并且每个阶段的乘法都会给出答案。

James,当你对函数的最后调用(当n == 0)时,它只是调用堆栈中fac(n)的几个实例之一。 如果你说print(fac(4)),那么堆栈本质上是:

fac(0)
fac(1)
fac(2)
fac(3)
fac(4)
print()

对fac(0)的最终调用适当地返回1,但是在Python中你已经请求了第一次调用fac(n),fac(4)的返回值。

不要认为它是一个循环,其中'ret'会爆发,返回简单地结束几个待处理的执行之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM