<blockquote>
<p>My question is why is the output of the first code reversed?</p>
</blockquote>
<p>从严格意义上讲,它并不是完全颠倒的,但我想我明白你的意思了。您可能希望在“子”调用之前打印“父”调用。你知道吗</p>
<p>但是,如果我们检查代码,就会发现:</p>
<pre><code>def gcdRecur(a,b):
if b==0:
print('I am here')
return a
else:
gcdRecur(b,a%b) # make child call
print(a,b) # print from the parent call
</code></pre>
<p>如果您将两者互换,它将以您可能称之为“正确方式”的方式打印:</p>
<pre><code>def gcdRecur(a,b):
if b==0:
print('I am here')
return a
else:
# swap printing and recursive calls
print(a,b) # print from the parent call
gcdRecur(b,a%b) # make child call
</code></pre>
<p>但是,如果使用<code>return</code>语句,函数从到达<code>return</code>的那一刻起就终止,因此如果在到达<code>return</code>语句之后打印内容,则打印永远不会发生。如果我们需要,我们可以使用一个<code>try</code>-<code>finally</code>构造。你知道吗</p>
<p>更深入地说,如果我们“<em>跟踪</em>”一个程序,例如使用(这是<em>不是</em>有效的Python代码,那么更深入地了解如何处理这些调用):</p>
<pre><code>gcdRecur(51,187)
if 187 == 0: # fails
else: # we take the else branch
gcdRecur(187,51)
if 51 == 0: # fails
else: # we take the else branch
gcdRecur(51,34)
if 51 == 0: # fails
else: # we take the else branch
gcdRecur(34,17)
if 51 == 0: # fails
else: # we take the else branch
gcdRecur(17,0)
if 0 == 0: # succeeds!
P print('I am here')
return 17
P print(34,17)
P print(51,34)
P print(187,51)
P print(51,187)
</code></pre>
<p>我在这里用一个<code>P</code>在左边标记了<code>print</code>的行。如您所见,带有<code>P</code>的行的顺序相同。你知道吗</p>