def test():
boo = True
enter = int(raw_input("Enter something: "))
if enter > 0:
boo = False
print "Did it work?!"
else:
print "Still working..."
while boo == True:
test()
test()
所以这段代码似乎只有在第一次遇到if语句的第一部分时才能工作。 又如果你输入-1然后1继续循环该函数。我做错了什么?
答案 0 :(得分:2)
boo
是本地变量。每次递归调用test()
时,该递归调用都会获得一个 new 局部变量boo
,该变量独立于调用它的所有父函数。因此,它在函数的开头设置为True
。
您的通话如下:
test()
,boo = True
,enter
= 1,所以while boo == True
为真:
test()
,boo = True
,enter
= -1,因此while boo == True
为false,返回在此级别,boo == True
仍为真,因此我们再次致电test()
。
test()
,boo = True
,enter
= -1,因此while boo == True
为false,返回等。 ad nauseum。
您希望返回 boo
:
def test():
boo = True
enter = int(raw_input("Enter something: "))
if enter > 0:
boo = False
print "Did it work?!"
else:
print "Still working..."
while boo:
boo = test()
return boo
现在,当test()
返回时,您将调用函数中的boo
设置为False
。
请注意,== True
是多余的,只需在boo
中测试while boo
本身。
将递归用于用户输入真的不是一个好主意。只需使用while
循环:
while True:
enter = int(raw_input("Enter something: "))
if enter < 0:
print "Did it work?!"
break
print "Still working..."
答案 1 :(得分:2)
将潜在的无限while
循环与递归函数相结合是一项非常危险的游戏。当您接到test()
的后续呼叫时,即使他们正常工作并立即退出,您对test()
的原始呼叫仍将永远循环。 boo
永远不会在原始函数调用中更改,因为它在以后的函数中已更改。
您的代码可以通过以下方式修复:
def test():
boo = True
enter = int(raw_input("Enter something: "))
if enter > 0:
boo = False
print "Did it work?!"
else:
print "Still working..."
if boo == True:
test()
但这样做会更好:
def test():
enter = int(raw_input("Enter something: "))
while enter <= 0:
print "Still working..."
enter = int(raw_input("Enter something: "))
print "Did it work?!"