您的位置:首页 > 编程语言 > C语言/C++

C++递归实现全排列

2015-10-18 19:31 423 查看
实现全排列是递归的一个初级应用,主要思想就是,通过每次遍历输出一个结果。

下面的函数实现的效果就是输入一组字符,输出以‘,’分隔的全排列,最多10个,如果有空格或换行,则提前结束。

//Permutation.cpp 通过递归实现全排列
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

const int MAX = 10;

template<class T>
void Swap(T& a, T& b)//交换函数
{
T temp = a;
a = b;
b = temp;
}

template<class T>
void Perm(T list[], int k, int m)//生成list[k:m]的全排列
{//list是要递归的数组,k是递归的层数,m是递归的终点
int i = 0;//i表示要用于和元素k互相交换的元素下标
if(k == m-1) {
for(i = 0; i<m-1; i++)
cout << list[i] << ',';
cout << list[i] << endl;
} else {
for(i = k; i<m; i++) {
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}

int main()
{
char ch[MAX];
int i = 0;
while(i<MAX){
cin.get(ch[i]);
if(ch[i] == ' ' || ch[i] == '\n')
break;
i++;
}
Perm(ch,0,i);
}


例如,如果输入是abc,则过程是这样的:

k=0 m=3 i=k=0 a与a交换,对{b,c}进行全排列

k=1 m=3 i=k=1 b与b交换,对{c}进行全排列

k=2 m=3 满足k == m-1 输出 a,b,c

k=1 m=3 i++ i=2 b与c交换,对{b}进行全排列

k=2 m=3 满足k == m-1 输出 a,c,b

k=0 m=3 i++ i=1 a与b交换,对{a,c}进行全排列

k=1 m=3 i=k=1 a与a交换,对{c}进行全排列

k=2 m=3 满足k == m-1 输出 b,a,c

k=1 m=3 i++ i=2 a与c交换,对{a}进行全排列

k=2 m=3 满足k == m-1 输出 b,c,a

以此类推,就可以得到{a,b,c}的全排列了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 递归