2010-12-23 77 views
2

我有问题,从递归函数返回值。红宝石递归函数

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

    ask_question question if answer.empty? 
    return answer 
end 

第一次答案正常返回,但我得到了在明年调用空字符串。 这是为什么?

回答

7

那是因为你没有返回你的递归调用返回ask_question值。

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

当您完成方法时,您所做的只是返回第一个用户输入值(在您的情况下为空字符串)。

+0

谢谢,我已经想通了我的错误已经... – Alex 2010-12-25 19:09:38

1

您的代码不起作用,因为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 
+0

为了证明@ tokland的角度来看,如果你运行你的程序,并按下回车键几次,然后打`CTRL + c`(对于* nix),您会看到一个堆栈跟踪与您输入的次数成比例。 – Jeremy 2010-12-23 11:47:59