<p>调用递归函数有点像复制并粘贴了内部函数。复制/粘贴和真正的递归之间有一些区别:</p>
<ul>
<li>每个函数都有自己的一组变量</li>
<li>当你自动调用一个复制函数时,你可以自动调用一个函数。(这就是递归的全部要点。)</li>
</ul>
<p>尽管存在这些差异,但是如果您正在努力理解递归调用,那么复制和粘贴是一种很好的方法。我们来试试你的功能吧。以下代码与您编写的代码相同,只要您不要键入“yes”太多次:</p>
<pre><code>def addtwo0():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo1()
def addtwo1():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo2()
def addtwo2():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
raise Exception("tried to recurse too deeply!")
</code></pre>
<p>如果我们把这些嵌入到一个函数中,也许会更清楚。我们必须重命名变量,这样它们就不会互相覆盖了。在</p>
^{pr2}$
<p>现在您可以看到问题的直接原因:将<code>inp2</code>设置为“yes”不会将<code>inp1</code>或{<cd3>}设置为yes。或者在原始代码中,在对<code>addtwo</code>的嵌套调用中将<code>inp</code>设置为“yes”,并没有将外部的{<cd6>}设置为yes,因为每个函数都有自己的一组变量。在</p>
<p>现在您还可以看到问题的根本原因:您不需要多个循环来执行此操作。递归(带有<code>if</code>)或<code>while</code>循环都足以重复检查条件。如果两者兼而有之,即使你解决了眼前的问题,也会让事情变得不必要的复杂。在本例中,<code>while</code>循环实际上是最简单的;将<code>input</code>语句放在其中,然后完全去掉递归调用。在</p>