我整天都在研究一个排列算法,以备周五的入学申请。在这之后,我终于弄懂了Heap算法,它对我来说似乎最简单、最优雅。
以下是该算法的示例:http://en.wikipedia.org/wiki/Heap%27s_algorithm
function permutationArr(num) {
var str = num.toString();
var arr = str.split('');
var permutations = [];
function getPerm(arr,n){
var localArr = arr.slice(0);
var i;
var swap;
var temp;
if(n==1){
permutations.push(localArr.toString());
return;
}
for(i=0;i<n;i++){
getPerm(localArr,n-1);
swap = (n%2 ? i: 0);
temp = localArr[swap];
localArr[swap] = localArr[n-1];
localArr[n-1] = temp;
}
}
getPerm(arr,arr.length);
console.log(permutations);
return;
}
permutationArr(1234);
最终排列数组的日志在这里:
["1,2,3,4", "1,3,2,4", "4,2,3,1", "4,3,2,1", "4,1,3,2", "4,3,1,2", "1,,3,4,2", "1,3,,4,2", "4,,3,1,2", "4,3,,1,2", "4,1,3,,2", "4,3,1,,2", "1,2,3,4,", "1,3,2,4,", "4,2,3,1,", "4,3,2,1,", "4,1,3,2,", "4,3,1,2,", "1,,3,4,2", "1,3,,4,2", "4,,3,1,2", "4,3,,1,2", "4,1,3,,2", "4,3,1,,2"]
它可以正确地获取前12个排列,然后神秘地添加了一个逗号,并且前12个排列被重复。我被难住了。
编辑:上面是更新后的代码,考虑到评论中的建议来帮助。仍然只能获得一半的排列。
n%2
等于0时,localArr[n]
和localArr[1]
看起来非常可疑。而且i<=n-1
可以简化为传统的i < n
(或者i != n
)。在基本情况下,你确定当n
等于1时也要执行循环吗? - Cameron