一、什么是遞歸算法
遞歸即遞推+回歸。遞歸算法是把問題轉化為規模縮小了的同類子問題,然后遞歸調用函數(或過程)來表示問題的解。
二、遞歸算法的特點
1.必須有 遞歸函數 + 遞歸出口
2.遞歸算法解題通常顯得簡潔,但效率較低且系統通過棧來儲存每一層的返回點、局部變量,遞歸次數過多容易造成棧溢出。
三、如何編寫遞歸函數
例:Hanoi 塔(問題內容不再贅述)
我們以三個圓盤(從小到大依次成為1,2,3號)三根柱子(A,B,C)為例:
想要將 3號 移至C柱
step1. 借助C把1、2號盤移到B;
step2. 將3號盤移至C;
想要將 2號 移至 C 柱 則用上述同樣的思想 (遞歸函數的內涵所在,將大問題逐個分解為相同小問題)
step1. 借助C 將 1號盤 移至 A柱 /*這里可以直接將 1號盤移至A,但如果 B盤上不止一個盤則需要借助C ,我這里是 按整體規律來寫*/
step2. 將 2號盤 移至 C;
最后將 1號盤 移至 C柱
Hanoi塔 解題步驟:
1.將 A 上 n-1 個盤子移到B (借助C)
2.把 A 上 剩下的盤子移到C
3.將 n-1 個盤子從B 移到 C (借助A)
!!!
不用死記A B C在各個盤移動時的站位,將他們想成
初始柱 過渡柱 目標柱 這樣在敲代碼時思路會清晰一些
代碼實踐:
#include<iostream> using namespace std; void move(char x1, char x2) { cout << x1 << "-->" << x2 << endl; } //A、B、C三個位置依次對應 初始柱/ 過渡柱/ 目標柱【是對應的位置對應各種柱子(初始、過渡、目標柱) 不是ABC字母對應】 void hanoi(int n, char A, char B, char C) { if (n == 1) move(A, C); else { hanoi(n - 1, A, C, B); //A為初始柱 C為過渡柱 B為目標柱 move(A, C); hanoi(n - 1, B, A, C); //B為初始柱 A為過渡柱 C為目標柱 } } int main() { cout << "輸入盤子數: "; int p; cin >> p; char A = 'A', B = 'B', C = 'C'; hanoi(p, A, B, C); return 0; }
----------------------------------------------------小分割線----------------------------------------------
注意遞歸算法的兩個必要條件遞歸出口和遞歸函數
認真分析如何將大問題分解為子問題
這些需要多加練習~
==============================大分割線=========================
如有錯誤還是希望評論指正 :)