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

2024-10-01 19:29:03 发布

您现在位置: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)

Tags: 函数ifdef朋友经验print教科书ideone
3条回答

如果在Python2.7上运行它,您可以很容易地看到输出是:

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

这是因为它首先打印所有深入递归的数字。然后按相反的顺序打印,每个加一个。你知道吗

递归在1处停止,因为在python2.7中1 / 2给出的结果是0。你知道吗


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


您可以检查python2和python3中除法的差异,例如在下面的问答中:Division in Python 2.7. and 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

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

Is print (N + 1) called every time the function is called or does it only print until N is 0?

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

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

相关问题 更多 >

    热门问题