天天看点

全排列递归实现

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);

作者:火星十一郎

出处:javascript:void(0)

本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

分享到:

更多