2013-11-27 33 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

你指出我在正确的方向。我能够使用地图而不是每个来获得正确的值。 –