所以我正在和一个朋友讨论下面的函数。让我们假设函数的输入是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。以前的所有递归调用都会发生同样的情况,相反,因为它是从上次调用返回的。