算法一:交换(递归)
function swap(arr,i,j) {
if(i!=j) {
var temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
var count=0;
function show(arr) {
document.write("P<sub>"+ ++count+"</sub>: "+arr+"<br />");
}
function perm(arr) {
(function fn(n) {
for(var i=n;i<arr.length;i++) {
swap(arr,i,n);
if(n+1<arr.length-1)
fn(n+1);
else
show(arr);
swap(arr,i,n);
}
})(0);
}
perm(["e1","e2","e3","e4"]);
算法二:链接(递归)
var count=0;
function show(arr) {
document.write("P<sub>"+ ++count+"</sub>: "+arr+"<br />");
}
function perm(arr) {
(function fn(source, result) {
if (source.length == 0)
show(result);
else
for (var i = 0; i < source.length; i++)
fn(source.slice(0, i).concat(source.slice(i + 1)), result.concat(source[i]));
})(arr, []);
}
perm(["e1", "e2", "e3", "e4"]);
算法三:回溯(递归)
var count = 0;
function show(arr) {
document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />");
}
function seek(index, n) {
if (n >= 0)
if (index[n] < index.length - 1) {
index[n]++;
if ((function () {
for (var i = 0; i < n; i++)
if (index[i] == index[n]) return true;
return false;
})())
return seek(index, n);
else
return true;
}
else {
index[n] = -1;
if (seek(index, n - 1))
return seek(index, n);
else
return false;
}
else
return false;
}
function perm(arr) {
var index = new Array(arr.length);
for (var i = 0; i < index.length; i++)
index[i] = -1;
for (i = 0; i < index.length - 1; i++)
seek(index, i);
while (seek(index, index.length - 1)) {
var temp = [];
for (i = 0; i < index.length; i++)
temp.push(arr[index[i]]);
show(temp);
}
}
perm(["e1", "e2", "e3", "e4"]);
算法四:回溯(非递归)
var count = 0;
function show(arr) {
document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />");
}
function seek(index, n) {
var flag = false, m = n;
do {
index[n]++;
if (index[n] == index.length)
index[n--] = -1;
else if (!(function () {
for (var i = 0; i < n; i++)
if (index[i] == index[n]) return true;
return false;
})())
if (m == n)
flag = true;
else
n++;
} while (!flag && n >= 0)
return flag;
}
function perm(arr) {
var index = new Array(arr.length);
for (var i = 0; i < index.length; i++)
index[i] = -1;
for (i = 0; i < index.length - 1; i++)
seek(index, i);
while (seek(index, index.length - 1)) {
var temp = [];
for (i = 0; i < index.length; i++)
temp.push(arr[index[i]]);
show(temp);
}
}
perm(["e1", "e2", "e3", "e4"]);
参考链接:https://www.jb51.net/article/39291.htm