我让学生给我以下代码:
def addtwo():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
addtwo()
在第一次迭代之后,如果用户输入除“是”之外的任何内容,则while循环的主体不会按预期执行。但是如果我们输入“是”,它会执行(再次,如预期的那样)并提示"输入任何数字",但在第二次迭代中,即使用户输入除#以外的任何内容39;是'在"你想再次输入",while循环STILL的主体执行。现在我在其上运行调试器,发现inp
的值在执行第5行时只更改为'yes'
。在执行行之前,inp
的值,根据调试器仍然是用户输入的内容。为什么会这样?
现在我在这里查了一下,但是找不到任何解释,虽然我找到了一种解决方法,在while循环体内调用addtwo()
之前添加一个返回值(我在这里找到了它:Calling a function recursively for user input)但是无法理解为什么inp
的值只是在本地堆栈中发生变化,以及return
语句如何修复它?
这是工作代码:
def addtwo():
numb=input("enter any number")
add=int(numb)+2
print(add)
inp = input("do you wish to enter again")
while inp=="yes":
return addtwo()
而且,为了添加我的谜题,如果我们使用if
语句而不是while
,代码就可以正常工作。
答案 0 :(得分:3)
<强>摘要强>
这是因为一旦你输入了yes,那么无论下一次递归调用是什么,该函数都将永远循环。
您可以通过更改以下内容来修复代码:
while inp == "yes":
add_two()
到
if inp == "yes":
add_two()
浏览
退货声明
默认情况下,在python中,不返回任何内容的函数实际上返回None。这意味着你调用add_two,如果用户没有输入&#34; yes&#34;当提示时,它将返回,这将强制第一次调用也返回。
答案 1 :(得分:1)
调用递归函数有点像是在那里复制并粘贴了内部函数。复制/粘贴和真正的递归之间存在一些差异:
尽管存在这些差异,如果您正在努力理解递归调用,复制和粘贴是一种思考它的好方法。让我们试试你的功能吧。以下代码等同于您编写的内容,只要您不多次输入“yes”:
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!")
如果我们将这些内联放在一个函数中,也许会更清楚。我们必须重命名变量,使它们不会相互覆盖。
def addtwo():
numb0=input("enter any number")
add0=int(numb0)+2
print(add0)
inp0 = input("do you wish to enter again")
while inp0=="yes":
numb1=input("enter any number")
add1=int(numb1)+2
print(add1)
inp1 = input("do you wish to enter again")
while inp1=="yes":
numb2=input("enter any number")
add2=int(numb2)+2
print(add2)
inp2 = input("do you wish to enter again")
while inp2=="yes":
raise Exception("tried to recurse too deeply!")
您现在可以看到问题的直接原因:将inp2
设置为“是”不会将inp1
或imp0
设置为是。或者在原始代码中,在inp
的嵌套调用中将addtwo
设置为“是”不会将外部imp
设置为是,因为每个函数都有自己的一组变量。
您现在还可以看到问题的根本原因:您不需要多个循环来执行此操作。递归(带有if
)或while
循环足以启用重复检查条件。通过兼顾两者,即使你解决了眼前的问题,你也会使事情变得不必要地复杂化。在这种情况下,while
循环实际上是最简单的;将input
语句放入其中并完全摆脱递归调用。