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