如何获取规定的排列组合?

本文介绍了如何通过递归算法来生成一组数字、字母或符号的不同排列组合。博客详细解析了递归过程,展示了如何将问题分解为更小的部分并使用旋转法来实现排列。代码示例展示了对于给定数字如1234的全排列实现,通过不断旋转和递归,最终输出所有可能的组合顺序。
摘要由CSDN通过智能技术生成

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值