2014-07-21 76 views
1
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語句的第一部分被滿足時才起作用。 aka如果輸入-1,則它繼續循環遍歷該函數。我究竟做錯了什麼?布爾語句和if語句中的問題

+2

什麼是你想要做什麼呢?從用戶獲取正整數輸入? – TheSoundDefense

+0

遞歸意圖是? – Don

+1

你有沒有意識到你的函數被循環調用,[遞歸](http://en.wikipedia.org/wiki/Recursion_%28computer_science%29)?這似乎有點奇怪。 – skrrgwasme

回答

2

boo本地變量。每次遞歸調用test()時,該遞歸調用將獲得一個新的局部變量boo,它獨立於調用它的所有父函數。因此,它在功能開始時設置爲True

你的電話是這樣的:

  • test()boo = Trueenter = 1,所以while boo == True是正確的:

    • test()boo = Trueenter = -1,所以while boo == True是假的,返回
  • 在這個水平上,boo == True仍然如此,所以我們再次呼籲test()

    • test()boo = Trueenter = -1,所以while boo == True是假的,返回

等廣告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()回報,你在調用函數到False設置boo

請注意,== True是多餘的,只需測試boo本身在while boo

使用遞歸進行用戶輸入確實不是一個好主意。只需使用一個while循環:

while True: 
    enter = int(raw_input("Enter something: ")) 
    if enter < 0: 
     print "Did it work?!" 
     break 
    print "Still working..." 
+0

(+1),但我認爲這將是很好的證明遞歸在這裏是完全不必要的,只會掩蓋邏輯。 – NPE

+0

@NPE:我正在忙着添加更好的選項。我想解釋OP首先出錯的地方。 –

+0

這是一個很好的解釋。謝謝。我是python的新手,肯定會閱讀遞歸。我認爲把所有東西放到while循環中會有很大的幫助。 – Joe

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?!"