全排列 —— 递归

http://blog.sina.com.cn/s/blog_4d8721980100dxnv.html 转

递归思想:
取出数组中第一个元素放到最后,即a[1]与a[n]交换,然后递归求a[n-1]的全排列

1)如果数组只有一个元素n=1,a={1} 则全排列就是{1}
2)如果数组有两个元素n=2,a={1,2} 则全排列是
{2,1}--a[1]与a[2]交换。交换后求a[2-1]={2}的全排列,归结到1)
{1,2}--a[2]与a[2]交换。交换后求a[2-1]={1}的全排列,归结到1)
3)如果数组有三个元素n=3,a={1,2,3} 则全排列是
{{2,3},1}--a[1]与a[3]交换。后求a[3-1]={2,3}的全排列,归结到2)
{{1,3},2)--a[2]与a[3]交换。后求a[3-1]={1,3}的全排列,归结到2)
{{1,2},3)--a[3]与a[3]交换。后求a[3-1]={1,2}的全排列,归结到2)
...
以此类推。
马上用C++代码实现,成功!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, N = 0;
void g(int *q)
{
int i;
for (i = 0; i < n; i++)
printf(" %d", q[i]);
N++;
cout << endl;
}

void f(int *p,int size)
{
int j;
if (size == 1)
g(p);
else
{
for (j = 0; j < size; j++)
{
// cout << p[j] << " " << p[size - 1] << " ";
swap(p[j], p[size-1]);
// cout << p[j] << " " << p[size - 1] << endl;
f(p, size-1);
swap(p[j], p[size-1]);
}
}
}
int main()
{
int a[] = {1, 2, 3};
n = sizeof(a) / sizeof(int);
f(a, n);
cout << N << endl;
return 0;
}

原文地址:https://www.cnblogs.com/ghostTao/p/4014901.html