递归应用-全排列

  全排列

  给定n个元素的{1,2,3,4,5,...,n}的序列,我们想产生该序列的所有排列(Permutation).对于n个元素的排列,一共有n!种。 那怎么设计算法?

  

    试试递归。

     1    初始条件条件,当元素只有一个的时候,全排列很简单的产生。

     2  怎么派生出小规模的同种类型的问题,将序列逐次按1的步长减小。比如 perm(m) 里面求perm(m+1)  (注:n 为元素下标 m>=0并  m<n ,依次下去,元素m-元素n之间的

         个 数越来越小)

      具体实施步骤

      固定位置找元素

    最关键的步骤

      也是就是说,如果我们能求出n-1个元素的全排列

        求出元素2,3,。。。。。,n的全排列 ,将元素1放到最前面

        求出元素1,3,。。。。。,n的全排列,将元素2 放到最前面

        以此循环得到序列n的全排列.

        这里面需要注意的问题,为了使全排列 序列不重复,每产生一次序列,需要将原来位置上的元素给换回来。

       相应的伪代码如下

     //arry[] n 序列n

     //m  游标

    // length 数组长度

      perm(arry[] n,m,length)

      {

          if    m=lenght -1   then   print(n); return;

          else

             for(int j=m ;j<length;j++)

              {

                         n[j] 与n[m] 互换;

                        perm(arry[] n,j,length);

                        n[j] 与n[m] 互换;

              }

                  return;

      }

     

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值