挑战是列出给定正整数的所有有序分区(组成(组合))n
。这些数字从名单1
到n
其总和n
。例如,给定input n = 4
,结果应为:
4
1,3
3,1
2,2
2,1,1
1,2,1
1,1,2
1,1,1,1
结果可以采用任何顺序,但是必须包含每个有序分区一次。这意味着n = 4
,[1, 1, 2]
,[1, 2, 1]
而且[2, 1, 1]
必须是结果的一部分。
这是我自己的实现此目的的JavaScript代码:
function range(n) {
for (var range = [], i = 0; i < n; range.push(++i));
return range;
}
function composition(n) {
return n < 1 ? [[]] : range(n).map(function(i) {
return composition(n - i).map(function(j) {
return [i].concat(j);
});
}).reduce(function(a, b) {
return a.concat(b);
});
}
Golfed,ES6(169 167 119 109 105 89 85个字节):
n=>n?[].concat(...[...Array(n)].map((x,i)=>i+1).map(b=>m(n-b).map(a=>[b,...a]))):[[]]