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

  • 本文关键字:调用 打印 函数 print N+1 python
  • 更新时间 :
  • 英文 :


所以我正在和一个朋友讨论下面的函数。让我们假设函数的输入是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)

如果你在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。


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


您可以检查Python 2和3中除法的差异,例如在以下问答中:Python 2.7中的除法。3.3

是的,它将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

已经回答了,但要澄清您实际询问的内容:

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

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

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

最新更新