2015-11-04 4 views
2

Начальный программист здесь, используя Python 2.7.10. У меня этот код:Функция Recursion

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

Он должен работать. Я только что протестировал его.

Объяснение:

Когда, если оператор называется функцией впервые, он ожидает значение, которое будет возвращено. Когда первый вход X, поток функции достигает части else и снова вызывает yesno(), чтобы запросить другой вход. Когда пользователь вводит Y, он возвращает TRUE не в вызывающий оператор if, а в первый вызов функции.

Это становится чем-то вроде этого:

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

Так, первый вызов функции НИКОГДА не возвращая ничего, ваше Условный оператор не получает так. Надеюсь, это поможет в понимании!

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