首先要注意的是,排列的数量相对于元素的数量增加得非常快(13 个元素 = 60 亿个排列),因此任何一种生成它们的算法都会在足够大的输入数组中降低性能。
第二要注意的是,由于排列的数量非常大,将它们存储在内存中的成本很高,因此最好使用生成器来生成排列并在它们生成时对其进行处理。
第三点要注意的是递归算法会带来很大的开销,所以即使你找到了递归的解决方案,你也应该努力得到一个非递归的解决方案。如果存在递归解决方案,则始终可以获得非递归解决方案,但这可能会增加代码的复杂性。
我已经为您编写了一个基于 Steinhaus–Johnson–Trotter 算法的非递归实现(http://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm)
function swap(arr, a,b){
var temp = arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
function factorial(n) {
var val = 1;
for (var i=1; i<n; i++) {
val *= i;
}
return val;
}
function permute(perm, func){
var total = factorial(perm.length);
for (var j=0, i=0, inc=1; j<total; j++, inc*=-1, i+=inc) {
for (; i<perm.length-1 && i>=0; i+=inc) {
func.call(perm);
swap (perm, i, i+1);
}
func.call(perm);
if (inc === 1) {
swap(perm, 0,1);
} else {
swap(perm, perm.length-1, perm.length-2);
}
}
}
console.clear();
count = 0;
permute([1,2,3,4,5,6], function(){console.log(this); count++;});
console.log('There have been ' + count + ' permutations');
http://jsbin.com/eXefawe/2/edit