1. 程式人生 > >遞歸的淺析與實現

遞歸的淺析與實現

八皇後 一個 漢諾塔問題 src closed lac space valid include

一、定義

  若一個對象部分的包含它自己,或用自己來定義自己,則稱為這個對象是遞歸的。

二、應用原則

1、基本條件:遞歸過程必須一直存在至少一個不使用遞歸方法解決的條件。

2、進行方向:任何遞歸調用都必須向著“基本條件”的方向進行。

3、正確假設:總是假設遞歸調用時有效的。

4、適度原則:避免使用過多的遞歸,尤其是效率要求高而遞歸調用鏈過長的情況下。

5、順序問題:變動遞歸調用的順序有可能導致整個函數執行順序的變化。

三、用例

1、漢諾塔問題

技術分享圖片
 1 #include <iostream>
 2 using namespace std;
 3 #define numOfDisks 3
 4
//1、漢諾塔問題-遞歸法 5 void Move(int n, char x, char y) 6 { 7 cout << "move " << n << " from " << x << " to " << y<<endl; 8 } 9 10 void Hannoi(int n,char a,char b,char c) 11 { 12 if (n == 1) 13 { 14 Move(n, a, c); 15 } 16 else 17 {
18 Hannoi(n - 1, a, c, b); 19 Move(n, a, c); 20 Hannoi(n - 1, b, a, c); 21 } 22 } 23 int main() 24 { 25 Hannoi(numOfDisks, a, b, c); 26 system("pause"); 27 return 0; 28 }
Hannoi

測試結果:

技術分享圖片

2、八皇後問題

技術分享圖片
 1 #include <iostream>
 2 #define MAX 4
 3 int sum = 0;
4 using namespace std; 5 //2、八皇後問題-回溯法 6 //首先要皇後不沖突,則每行只能有一個皇後 7 //用queens[]數組來表示每個皇後存儲的位置,如queens[m] = n 表示第m行的皇後放在第n列上 8 class QueenPuzzle 9 { 10 public: 11 void printOut(); //打印結果 12 bool IsValid(int n); //判斷第n個皇後放上去是否合適 13 void placeQueen(int n); //遞歸算法放置皇後 14 15 16 private: 17 int queens[MAX]; 18 }; 19 20 void QueenPuzzle::printOut() 21 { 22 for (int i =0;i<MAX;i++) 23 { 24 for (int j=0;j<MAX;j++) 25 { 26 if (j==queens[i]) 27 cout << "X "; 28 else 29 cout << "0 "; 30 } 31 cout << endl; 32 } 33 } 34 35 36 bool QueenPuzzle::IsValid(int n) 37 { 38 //將第n個皇後的位置依次和前面的 39 for (int i = 0; i < n; i++) 40 { 41 //兩個皇後在同一列上,返回false 42 if (queens[i] == queens[n]) 43 return false; 44 //兩個皇後在同一對角線上,返回false 45 if (abs(queens[i] - queens[n]) == n - i) 46 return false; 47 } 48 return true; 49 } 50 51 void QueenPuzzle::placeQueen(int n) 52 { 53 for (int i =0;i<MAX;i++) 54 { 55 if (n==MAX) //如果放完了,則直接輸出結果 56 { 57 sum++; 58 cout << "" << sum << "組解:" << endl; 59 printOut(); 60 return; 61 } 62 //放置後 63 queens[n] = i; 64 //次位置內不能放置皇後 65 if (IsValid(n)) 66 placeQueen(n + 1); 67 } 68 } 69 70 int main() 71 { 72 QueenPuzzle queen; 73 queen.placeQueen(0); 74 cout << "" << sum << "組解"; 75 system("pause"); 76 return 0; 77 }
View Code

測試結果:(測試中用的是四皇後)

技術分享圖片

遞歸的淺析與實現