函数递归

2024-05-15 09:19:28 发布

您现在位置:Python中文网/ 问答频道 /正文

初学者程序员在这里,使用python2.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”,最后仍然会打印“No”。有没有更好的方法重新启动函数本身?你知道吗


Tags: noanswertrue密码inputrawreturnif
3条回答

您的错误只是没有从递归调用返回值。将else分支更改为return yesno(),它将正常工作。您可以使用while循环而不是函数来实现这一点:

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

试试这个:

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语句没有变为true。希望这有助于理解!你知道吗

没有递归函数有更好的方法。如果用户没有输入正确的输入,只需抛出一个错误或打印一条消息:

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()

相关问题 更多 >