全排列递归实现

BFS一般是不会用递归的,而且很不好实现,因为是采用队列机制,而不是栈机
制。
但是恰恰好的,递归就是栈机制,所以递归其实就是DFS
是栈机制啊,DFS就是栈机制

 

你要是不用递归,也可以实现DFS,但是要用到栈
递归只是使用了一个自动的栈机制

 


火星十一郎

设R= {r1,r2,r3,……,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中的元
素的全排列记为perm(X).(ri)perm(X)表示在全排列perm(X)的每一个排列前加
上前缀ri得到的排列,R的全排列可归纳定义如下:
当n=1,perm(R) = (r) ,其中r是集合R中唯一的元素。
当n>1,perm(R)由(r1)perm(R1),(r2)perm(R2),……,(rn)perm(Rn)构成。

//该算法无法实现重拍,也就是说会重复输出

#include <iostream>
using namespace std;

void swap(int a[], int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

void perm(int a[], int start, int end)
{
int i;
if(start == end)//当k等于m时,表示已经递归到单个元素全排列(基本
部分)
{
for(i = 0; i <= end; i++)
cout << a[i] << " ";
cout << endl;
}
else
{
for(i = start; i <= end; i++)
{
swap(a,start,i);//这里要用到两个swap,是为了不改变在
本函数中a数组中的顺序,而进行下一个循环
perm(a,start + 1,end);
swap(a,start,i);
}
}
}

int main(void)
{

int a[5] = {1,2,3,4,5};
perm(a,0,4);

system("pause");
return 0;
}


#include <stdio.h>
inline void Swap(char& a, char& b)
{// 交换a和b
char temp = a;
a = b;
b = temp;
}

void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++)
putchar(list[i]);
putchar('\n');
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++) {
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);
}
}

int main()
{
char s[]="123";
Perm(s, 0, 2);
return 0;
}

posted @ 2012-04-12 17:19  加拿大小哥哥  阅读(346)  评论(3编辑  收藏  举报