2012-01-15 83 views
0

我必須根據有多少物體做一些非常重複的計算。Rails Ruby - 如何基於計數的對象創建循環?

示例有4個對象。

然後我必須做這些計算:

1+2 
1+3 
1+4 

2+1 
2+3 
2+4 

3+1 
3+2 
3+4 

4+1 
4+2 
4+3 

1+3+2 
1+4+3 
1+2+4 

3+2+1 
3+4+2 
3+2+4 

4+2+1 
4+3+1 
4+2+3 

1+2+3+4 

如何在所有可能性的計算非重複的方式做到這一點? 我想計算所有的可能性,期望對象我不出現兩次。

回答

2
objs = [1, 2, 3, 4] 
(1..objs.size).map {|i| objs.permutation(i).map {|o| o.reduce(:+) } }.flatten(1) 
# => [ 
1, # 1 
2, # 2 
3, # 3 
4, # 4 
3, # 1+2 
4, # 1+3 
5, # 1+4 
3, # 2+1 
5, # 2+3 
6, # 2+4 
... 
10, # 1+2+3+4 
... 
10 # 4+3+2+1 
] 
+0

5,#2 + 4 :)拼寫錯誤.... – 2012-01-15 21:25:15

+2

一些細節:加法是一個交換操作,所以你可以簡單地做一個'objs.combination(i)'而不是一個置換。和map + flatten(1) - > flat_map(ruby 1.9)。 '2.upto(xs.size).flat_map {| n | xs.combination(n).map {| cs | cs.inject(:+)}}' – tokland 2012-01-15 22:28:54

+0

@tokland如何組合? :) – 2012-01-15 22:29:39

1

你可以看一下Array.permutations

當與塊調用,產率進制的元件的長度爲n的所有排列,然後返回該數組本身。如果未指定n,則產生所有元素的所有排列。實現不能保證排列的順序。

+1

請包括摘錄或解釋。作爲評論,「裸鏈接」更好。 – 2012-01-15 21:55:18