【问题标题】:Is print (N + 1) called every time the function is called or does it only print until N is 0? [duplicate]每次调用函数时都会调用 print (N + 1) 还是只打印到 N 为 0? [复制]
【发布时间】:2026-02-04 15:10:02
【问题描述】:

所以我正在和朋友谈论以下功能。假设函数的输入是 100。有人说这将打印 100、50、25、12、6、3、1、1,而另一位则认为它应该打印 100、101、50、51 和很快。我尝试自己运行它来查看结果,但是我没有使用 Python 的经验,这只是教科书上的一个练习,当我尝试在 ideone 上运行它时,它没有提供任何输出。谢谢!

def CodeWrite (N):

    if (N > 0):
        print(N)
        CodeWrite(N / 2)
    print(N + 1)

【问题讨论】:

  • 将其写入文件,例如foo.py,然后运行它...python foo.py。让python告诉你谁是对的。
  • 你可能会遇到“腌制对象时超出最大递归深度”的错误:) .. 你可能想要一个更好的终止条件。
  • 这取决于 -- 如果你在 Python 3 上运行,N / 2 会产生浮点数。
  • 对不起,我不得不对此投反对票,但基本前提很容易自己验证。甚至 python2 和 3 之间的不同行为也很容易通过 Google 自行查找。
  • 在您编写的文件末尾添加一行:CodeWrite(100)。它应该一直向左 - 不与函数缩进。你必须在函数运行之前调用它。

标签: python


【解决方案1】:

如果你在 Python 2.7 上运行它,你可以很容易地看到输出是:

100
50
25
12
6
3
1
1
2
4
7
13
26
51
101        

这是因为它首先打印所有深入递归的数字。然后它以相反的顺序打印它们,每个都加一个。

递归在 1 处停止,因为在 Python 2.7 中 1 / 2 给出的结果为 0。


对于 Python 3,它很可能会得到 RuntimeError: maximum recursion depth exceeded while calling a Python object 错误,因为除法会产生浮点数并且不会在递归次数较少时停止。


您可以检查 Python 2 和 3 中除法的差异,例如在此问答中:Division in Python 2.7. and 3.3

【讨论】:

    【解决方案2】:

    是的,它会将 N 除以 2 直到 0,但是当程序完成递归调用后,它将开始向外调用 N+1

    拨打CodeWrite(100)时,会收到一长串号码:

    >>> CodeWrite(100)
    100
    50
    25
    12
    6
    3
    1
    1
    2
    4
    7
    13
    26
    51
    101
    

    我们可以通过查看调用的踪迹来简化它:

    CodeWrite(100)
      CodeWrite(50)
        CodeWrite(25)
          CodeWrite(12) #Because integer division, 25/2 = 12.5 -> 12
            CodeWrite(6)
              CodeWrite(3)
                 CodeWrite(1) #3/2 = 1.5, truncated to 1
                    CodeWrite(0) #1/2 = 0.5, truncated to 0
                    #Stops calling N > 0, since N == 0
                    print(0+1) -> 1
                 print(1+1) -> 2
              print(3+1) -> 4
             print(6+1) -> 7
           print(12+1) -> 13
         print(25+1) -> 26
       print(50+1) -> 51
     print(100+1) -> 101
    

    【讨论】:

    • 在调用CodeWrite(N / 2)之前,会执行print(N)
    • 绘制调用堆栈的好方法 :-)
    • @Reti43,是的,感谢您的澄清 :)
    • 谢谢!!我现在可以看到了!
    【解决方案3】:

    已经回答,但要澄清您的实际问题:

    每次调用函数时都会调用 print (N + 1) 还是只打印到 N 为 0?

    每当 N 大于 0 时,它就会打印 N 并执行 CodeWrite(N / 2),所以基本上到函数的顶部,如果你想这样想的话。

    当 N 不大于 0 时,它会转到 print(N + 1) 并离开函数并返回。在前面的递归中,它在CodeWrite(N / 2) 之后返回到它停止的地方并打印 N+1。所有之前的递归调用都会发生同样的事情,并且相反,因为它是从最后一次调用返回的。

    【讨论】:

    • 感谢您的解释!现在很清楚了
    • 欢迎来到 SO。通常,您应该支持对您有帮助的答案并接受最适合您的答案。你已经完成了后者,很好的开始。
    最近更新 更多