2012-01-15 31 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