Руби рекурсивная функция - PullRequest
       0

Руби рекурсивная функция

2 голосов
/ 23 декабря 2010

У меня проблема с возвратом значения из рекурсивной функции.

def ask_question(question)
    print question
    answer = STDIN.gets.chomp

    ask_question question if answer.empty?
    return answer
end

В первый раз, когда ответ возвращается правильно, но я получил пустую строку в следующих вызовах.Почему это?

Ответы [ 2 ]

7 голосов
/ 23 декабря 2010

Это потому, что вы не возвращаете значение, возвращаемое вашими рекурсивными вызовами, на ask_question.

def ask_question(question)
    print question
    answer = STDIN.gets.chomp
    answer = ask_question question if answer.empty?
    return answer;
end

Все, что вы делали, это возвращали первое введенное пользователем значение (в вашем случае пустую строку), когда метод был завершен.

1 голос
/ 23 декабря 2010

Ваш код не работает, потому что переменная answer, которую вы возвращаете, всегда равна первой в первой итерации (каждый вызов имеет свою локальную область видимости). Таким образом, возможное решение:

def ask_question(question)
    print question
    answer = STDIN.gets.chomp
    answer.empty? ? ask_question(question) : answer
end

Обратите внимание, что эта рекурсивная конструкция хороша для языков, которые поддерживают оптимизацию хвостовых вызовов, но Ruby не форсирует ее, поэтому обычно создает новый кадр стека для каждой итерации и, в конце концов, будет работать. Я бы порекомендовал цикл, например:

def ask_question(question)
  loop do 
    print question
    answer = STDIN.gets.chomp
    break answer unless answer.empty?
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...