2015-03-02 79 views
1

我試圖產生給定數組的完整排列。例如,如果輸入是fact(2, ['A', 'B']),則輸出應爲[["A", "A"], ["B", "A"], ["A", "B"], ["B", "B"]]紅寶石注入奇怪行爲

def fact(n, arr) 
    return [[]] if n == 0 
    nxt = fact(n - 1, arr).freeze 
    arr.inject([]){ |result, elem| nxt.each { |x| result.push(x + [elem]); result } } 
end 

但是,當我試圖使用'更多功能編程'的方式做到這一點,發生了一些奇怪的事情。口譯員抱怨Untitled 4.rb:4:in 'push': can't modify frozen Array (RuntimeError)。我其實試圖修改注入數組result,它怎麼可能改變nxt

回答

3

它內置的,這是懶惰:

perms = ['A', 'B'].repeated_permutation(2) 
#use the resulting enumerator like this: 
perms.each{|perm| p perm} 
1

原來是一個錯字。

def fact(n, arr) 
    return [[]] if n == 0 
    nxt = fact(n - 1, arr).freeze 
    arr.inject([]){ |a, elem| nxt.each { |x| a.push(x + [elem]) }; a } 
end 
+0

您可能希望使用',因爲它避免了對鏈'了'向前each_with_object'作爲替代'inject'這裏。 – tadman 2015-03-02 23:40:26