繁体   English   中英

Python函数返回循环

[英]Python Function Return Loop

好的,所以这段代码来自我学校的练习题。 我们要在心理上解析代码并检查答案。

当我第一次解析它时,我得到4.我复制了代码并通过IDLE运行它得到8.我运行调试器并看到else:return循环if else语句直到x == 0然后它返回1 。

我不明白返回1是如何出现在8。

def foo(x=5):
    if x == 0:
        return 1
    else:
        return 2*foo(x-1)

print(foo(3))

我理解它在函数foo(x=5)中调用foo(x-1) ,这使得它一次又一次地检查是否为x == 0然后返回1.返回1如何最终打印8?

您将对foo进行以下调用:

foo(3) -> foo(2) -> foo(1) -> foo(0)

那些会回来的

foo(0) -> 1
foo(1) -> 2 * foo(0) -> 2 * 1 -> 2
foo(2) -> 2 * foo(1) -> 2 * 2 -> 4
foo(3) -> 2 * foo(2) -> 2 * 4 -> 8

现在清楚了吗?

我认为你有正确的想法(否则你不会得到答案4),你只是在心理锻炼中过早堕胎。

您可以在浏览代码时通过列表来跟踪变量:

  • foo(3)
    • 调用foo(3 - 1)foo(2)
      • 调用foo(2 - 1)foo(1)
        • 调用foo(1 - 1)foo(0)
          • 返回1
        • 返回2 * foo(1 - 1)2
      • 返回2 * foo(2 - 1)4
    • 返回2 * foo(3 - 1)8

递归与您最初期望的相反。 它不是以x = 3开头,而是跟随所有递归调用,x的第一个值实际上是0。

下面是您脚本的修改版本,它说明了如何运行步骤以及它如何到达8的顺序。

def foo(x=5):
    if x == 0:
        r = 1
        print (x, r)
        return r
    else:
        r = 2*foo(x-1)
        print (x, r)
        return r

print(foo(3))

注意打印的x的第一个值是1而不是你给它的3。 一旦你理解了这一点,你就会理解递归。

暂无
暂无

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

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