2013-11-27 84 views
0

我有兩種方法:Ruby中的遞歸問題:我是否遇到副作用?

def word_square_word_list 
    @word_list.each do |word| 
    return_value = find_next_word([word]) 
    #check return_value here and it is completely different than what is returned from the find_next_word method. 
    return return_value if is_list_valid?(return_value) 
    end 
end 

def find_next_word(word_list_array) 
    if word_list_array.length == @size_of_square 
    #confirm word_list_array is what I expect here 
    word_list_array 
    else 
    start_of_next_word = word_list_array.map{|w| w[word_list_array.length]}.join 
    get_all_words_that_start_with(start_of_next_word).each do |word| 
     find_next_word(word_list_array + [word]) 
    end 
    end 
end 

我可以用binding.pry確認由find_next_word返回word_list_array其實正確的值。但是當我去檢查返回值時,它是完全不同的東西。

我可以想出唯一的解釋是,我正在經歷實施的副作用。有沒有人有什麼想法可能會導致這一點?

+0

如果'word_list_array.length == @ size_of_square'爲false,那麼'find_next_word'的返回值將是'get_all_words_that_start_with(start_of_next_word)'列表。遞歸在最終的返回值中丟失。 – Matt

+0

@Matt,我通過pry證實,這不是虛假的,因爲我最終在裏面。但是,你解釋的是我正在經歷的症狀。儘管如此,我認爲這與Alex的解釋有關。 –

回答

1

它看起來像你缺少一些代碼,因爲在word_square_word_list目前未定義。

如果你提供了一個錯誤的例子,這將是有幫助的。這就是說,我懷疑,這個問題是:

get_all_words_that_start_with(start_of_next_word).each do |word| 
    find_next_word(word_list_array + [word]) 
end 

您的each塊內調用find_next_word,但什麼都不做,結果。 each返回被調用的對象,因此find_next_word的返回值將在else的情況下爲get_all_words_that_start_with(start_of_next_word)

還值得注意的是word_square_word_list也有它的問題。如果您嘗試使用each區塊中的return,則會出現LocalJumpError: unexpected return異常。

+0

你正在描述的每個塊都是我正在經歷的。我期望得到的值是[「card」,「area」,「rear」,「dart」],但是我得到了[「area」],它是'get_all_words_that_start_with(start_of_next_word)'的返回值。我需要做些什麼來解決這個問題? –

+0

你指出我在正確的方向。我能夠使用地圖而不是每個來獲得正確的值。 –