思路
首先对于一个给定的字符 【abcd】,很明显,最容易想到的全排列方式是先固定住a,然后把bcd给全排列,然后继续分解便是,固定住ab,把cd给全排列了,而此时的cd的全排列,便是cd位置进行调换
- 确定函数及参数 Perm(char str[], int begin, int end),其中,str 为需要全排列的数组,begin代表数组首位,end代表这次全排列过程中,数组的最大索引,也就是这个数组的长度-1,比如abcd,第一次递归时, begin 为 0 ,end 为 这个数组长度-1 为 3。
- 设置函数内的变量 i 作为可以变动的索引值
- 首先固定第一个字符,i = begin,开始递归时,begin = 0,此时 i = 0,对 i <=3开始循环,目的是,依次固定首字母,此时固定了a,for 循环体内的Perm开始对bcd进行递归,固定了b。
- 最后需要一个递归出口,也就是当函数最后begin = end时,我们知道,此时无法继续全排列了,只剩下一个字符,输出数组。递归结束。
#include <iostream>
#include<string.h>
using namespace std;
void Perm(char str[], int begin, int end) {
int i;
if (begin == end) {
for (i = 0; i <= end; ++i)
cout << str[i];
cout << endl;
} else {
for (i = begin; i <= end; ++i) {
swap(str[i], str[begin]);
Perm(str, begin+1, end);
swap(str[i], str[begin]);
}
}
}
int main() {
char str[] = {'a','b','c'};
int len = sizeof(str)/ sizeof(str[0])-1;
Perm(str, 0, len);
return 0;
}