day13
题目描述:
将一组数字,字母或符号进行排列,以得到不同的组合顺序,例如1,2,3这三个数的排列组合有:123,132,213,231,312,321.
解析:
可以使用递归将问题切割为较小的单元进行排列组合,如1 2 3 4的排列组合可以分为
1 [2 3 4],2[1 3 4],3[1 2 4],4[1 2 3]进行排列,这个过程可以使用旋转法来实现,即先将旋转间隔设为0,再将最右边的数字旋转至最左边,并逐步增加旋转的间隔,然后对后面的子数组使用递归的方式进行求解,例如:
1 2 3 4 -->旋转1 -->继续将右边2 3 4 进行递归处理
2 1 3 4 -->旋转1 2 变为2 1 -->继续将右边1 3 4 进行递归处理
3 1 2 4 -->旋转1 2 3 变为 3 1 2-->继续将右边1 2 4 进行递归处理
4 1 2 3 -->旋转1 2 3 4变为 4 1 2 3-->继续将右边1 2 3 进行递归处理
实现代码为:
<script>
var N=4,
num=[];
for(var i=1;i<=N;i++){
num[i]=i;
perm(num,1);
function perm(num,i){
var j,k,tmp;
if(i<N){
for(j=i;j<=N;j++){
tmp=num[j];
//旋转该区段最右边数字至最左边
for(k=j;k>i;k--){
num[k]=num[k-1];
num[i]=tmp;
perm(num,i+1);
//还原
for(k=i;k<j;k++){
num[k]=num[k+1];
num[j]=tmp;
}
}
}
}else{
var txt='';
for(j=1;j<=N;j++){
txt=num[j]+' ';
console.log(txt);
}
}
}
}
</script>