疫情期间手机直线:18622734798
当前位置:首页网站设计:基础篇 → 全部信息
C++算法应用——用递归求排列
更新时间:2012/11/6 点击:1222次

通常我们希望检查n 个不同元素的所有排列方式以确定一个最佳的排列。比如,
a,b 和c 的排列方式有:a b c, a c b, b a c, b c a, cab 和c b a。n 个元素的排列方式共有n !种。
由于采用非递归的C + +函数来输出n 个元素的所有排列方式很困难,所以可以开发一个递
归函数来实现。令E= {e1 , ..., en }表示n 个元素的集合,我们的目标是生成该集合的所有排列方
式。令Ei 为E中移去元素i 以后所获得的集合,perm (X) 表示集合X 中元素的排列方式,ei . p e r m
(X)表示在perm (X) 中的每个排列方式的前面均加上ei 以后所得到的排列方式。例如,如果
E= {a, b, c},那么E1= {b, c},perm (E1 ) = ( b c, c b),e1 .perm (E1) = (a b c, a c b)。
对于递归的基本部分,采用n = 1。当只有一个元素时,只可能产生一种排列方式,所以
perm (E) = ( e),其中e 是E 中的唯一元素。当n > 1时,perm (E) = e1 .perm (E1 ) +e2 .p e r m
(E2 ) +e3.perm (E3) + ? +en .perm (En )。这种递归定义形式是采用n 个perm (X) 来定义perm (E), 其
中每个X 包含n- 1个元素。至此,一个完整的递归定义所需要的基本部分和递归部分都已完成。
第1章C ++程序设计7
下载
当n= 3并且E=(a, b, c)时,按照前面的递归定义可得perm (E) =a.perm ( {b, c} ) +b.perm ( {a,
c} ) +c.perm ( {a, b} )。同样,按照递归定义有perm ( {b, c} ) =b.perm ( {c} ) +c.perm ( {b}), 所以
a.perm ( {b, c} ) = ab.perm ( {c} ) + ac.perm ( {b}) = a b . c + ac.b = (a b c, a c b)。同理可得
b.perm ( {a, c}) = ba.perm ( {c}) + bc.perm ( {a}) = b a . c + b c . a = (b a c, b c a),c.perm ( {a, b}) =
ca.perm ( {b}) + cb.perm ( {a}) = c a . b + c b . a = (c a b, c b a)。所以perm (E) = (a b c, a c b, b a c, b c a,
c a b, c b a)。
#include <iostream>
using namespace std;
void Swap(char &a,char &b)//交换
{
    char tmp;
    tmp=a;
    a=b;
    b=tmp;
}
void Permutation(char src[],int begin,int end)
{
    if (begin==end)
    {
        for (int i = 0; i <= end; i++)
cout << src[i];
        cout << endl;
    }
    for (int i=begin;i<=end;++i)
    {
        Swap(src[begin],src[i]);
        Permutation(src,begin+1,end);
        Swap(src[begin],src[i]);
    }
}
void main()
{
    char src[3]={'a','b','c'};
    Permutation(src,0,2);
    cin.get();
}
  • 疫情期间手机直线:18622734798    服务邮箱:service@nfree.cn     QQ:1448132697
  • 地址:天津市河西区围堤道146号华盛广场B座22楼    

    津公网安备 12010302001042号

  • CopyRight 2006~2024 All Rights Reserved 天津市华易动力信息科技有限公司