2015-11-04 145 views
2

初學程序員在這裏,使用Python 2.7.10。我有這樣的代碼:函數遞歸

def yesno(): 
    answer = raw_input("(Y/N) > ").upper() 
    if answer == "Y": 
     return True 
    elif answer == "N": 
     return False 
    else: 
     yesno() 

if yesno(): 
    print("Yes") 
else: 
    print("No") 

我想調用內部的函數來重新啓動它,如果條件不滿足。我遇到的問題是,當我重新啓動它不止一次,它不會返回它應該的值。例如,如果我第一次輸入「X」,但第二次輸入「Y」,最後仍會輸出「否」。有沒有更好的方法來重新啓動它自己的功能?

+2

'return yesno()'而不是'yesno()' – inspectorG4dget

回答

2

試試這個:

def yesno(): 
    answer = raw_input("(Y/N) > ").upper() 
    if answer == "Y": 
     return True 
    elif answer == "N": 
     return False 
    else: 
     return yesno()  # CHANGE IN THIS LINE. 

if yesno(): 
    print("Yes") 
else: 
    print("No") 

它應該工作。我剛纔測試了它。

說明:

當if語句稱爲首次的功能,它期待的值返回。當第一個輸入是X時,函數的流程到達else部分並再次調用yesno()來請求另一個輸入。當用戶輸入Y時,它不會返回到調用它的if語句,而是返回到第一個函數調用。

這就變成是這樣的:

if answer == "Y": 
    return True 
elif answer == "N": 
    return False 
else: 
    True  # Notice that the function is NOT returning this True. 

因爲,該函數的第一個電話是永遠不會返回任何東西,你的if語句是沒有得到正確的。希望這有助於理解!

+0

感謝您的解釋! – bisqueboy

0

有沒有更好的方式做到這一點,沒有遞歸函數。只是拋出一個錯誤,或打印一個消息,如果用戶沒有輸入正確的輸入:

def yes_or_no(prompt): 
    user_input = raw_input(prompt): 
    if user_input == "y": 
     return True 
    elif user_input == "n": 
     return False 
    else: 
     # Display a helpful message here. 

有幾個優點,這種方法,而不是遞歸函數。如果你使用遞歸函數,每次你重新調用它,你都會繼續推送到棧幀,一旦你遞歸了1000次以上,你的程序就會拋出一個錯誤。

這是最好顯示一條消息,並再次要求輸入。

如果你真的想遞歸的解決方案,那麼就從這一變化的遞歸調用:

yesno() 

要這樣:

return yesno() 
0

你的錯誤很簡單,就是你沒有從遞歸調用返回值。將else分支更改爲return yesno(),它會正常工作。你可以用while循環,而不是一個功能做到這一點:

answer = '' 
while answer != 'Y' and answer != 'N': 
    answer = raw_input("(Y/N) > ").upper()