使用JavaScript生成数字系列的所有组合

时间:2014-03-13 14:08:14

标签: javascript sequence combinations

我的头与我并不相信,希望有人可以帮助......

我们说我有:

1234567

我希望生成所有可能组合的列表,唯一的限制是:

  • 一个号码只能出现一次
  • 较高的数字不能超过较低的数字。

所以,像这样:

1
2
3
4
5
6
7

12
13
14
15
16
17

123
1234
12345
123456
1234567

134
1345
...

2 个答案:

答案 0 :(得分:4)

这是一个递归算法,它假设一个范围:

function ranges(from,to,soFar){
    console.log(soFar);
    if(from === to){
         return;
    }
    for(var i = from + 1;i <= to;i++){
         ranges(i,to,soFar+i); // append any number that's still possible
    }
}

用法为ranges(0,7,"")

在每个阶段:

  • 打印当前结果(atm也打印空字符串,您可以将其过滤掉)
  • 如果有更大的值 - 迭代更大的值并递归调用函数。

答案 1 :(得分:1)

@Benjamin Gruenbaum很棒的解决方案。也很快。即使我之前使用过这样的递归,我仍然缺乏算法知识。希望你不要介意我修改你的代码以产生一个二维数组来提供某种排序结果:

var results = [];
function ranges(from,to,soFar){
    if(soFar != ''){
        if(!results[soFar.length]){
            results[soFar.length] = [];
        }

        results[soFar.length].push(soFar);
    }
    if(from === to){
         return;
    }
    for(var i = from + 1;i <= to;i++){
         ranges(i,to,soFar+i); // append any number that's still possible
    }
}

ranges(0, 4, '');
console.log(results);

如果你有更好的方法,请告诉你。

如果你想要你的结果&#34;打印&#34;出来,这样做:

for(var i = 1; l = results.length, i < l; i++)
{
    console.log(results[i].join('\n'));
}

'\n'替换为<br/>以获取HTML。控制台日志仅用于审核目的。