2015-11-04 144 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()