2024-10-01 19:29:03 发布
网友
所以我正在和一个朋友讨论下面的函数。假设函数的输入是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)
如果在Python2.7上运行它,您可以很容易地看到输出是:
100 50 25 12 6 3 1 1 2 4 7 13 26 51 101
这是因为它首先打印所有深入递归的数字。然后按相反的顺序打印,每个加一个。你知道吗
递归在1处停止,因为在python2.7中1 / 2给出的结果是0。你知道吗
1 / 2
对于python3,它很可能会得到RuntimeError: maximum recursion depth exceeded while calling a Python object错误,因为除法会产生浮点数,并且不会在递归次数较少时停止。你知道吗
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。你知道吗
N+1
调用CodeWrite(100)时,您会得到一长串数字:
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),所以基本上是到函数的顶部,如果你想这样想的话。你知道吗
CodeWrite(N / 2)
当N不大于0时,它将转到print(N + 1)并离开函数,返回。在前面的递归中,它返回到CodeWrite(N / 2)之后停止的位置并打印N+1。以前的所有递归调用都会发生同样的情况,反之亦然,因为它是从最后一次调用返回的。你知道吗
print(N + 1)
如果在Python2.7上运行它,您可以很容易地看到输出是:
这是因为它首先打印所有深入递归的数字。然后按相反的顺序打印,每个加一个。你知道吗
递归在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)
时,您会得到一长串数字:我们可以通过查看调用的跟踪来简化它:
已经回答了,但要澄清您实际提出的问题:
每当N大于0时,它就打印N并执行
CodeWrite(N / 2)
,所以基本上是到函数的顶部,如果你想这样想的话。你知道吗当N不大于0时,它将转到
print(N + 1)
并离开函数,返回。在前面的递归中,它返回到CodeWrite(N / 2)
之后停止的位置并打印N+1。以前的所有递归调用都会发生同样的情况,反之亦然,因为它是从最后一次调用返回的。你知道吗相关问题 更多 >
编程相关推荐