天天看點

全排列遞歸實作

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)

本文版權歸作者火星十一郎所有,歡迎轉載和商用,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

分享到:

更多