2010-12-23 56 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