what's the 遞迴演算法
定義:
程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法(recursion)。
乙個過程或函式在其定義或說明中又直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量
特點:
任何乙個可以用計算機求解的問題所需的計算時間都與其規模n有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。
分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
如果原問題可分割成k個子問題(1<k≤n),且這些子問題都可解,並可利用這些子問題的解求出原問題的解,那麼這種分治法就是可行的。
由分治法產生的子問題往往是原問題的較小模式,這就為使用遞迴技術提供了方便。
注意事項:
遞迴演算法執行效率較低
容易爆棧
一定要設定遞迴出口不然容易死鎖而且爆棧
why we learn this?
遞迴是搜尋、分治、回溯演算法的
例題:1. fibonacci數列
我們之前寫過遞推的方法,這次我們寫遞迴的方法。
ps:矩陣快速冪和母函式是解決此類問題的最快方式,有興趣的可以去我部落格裡看看。
int fib(int n)
int main()
3.整數劃分問題題目:將乙個整數劃分為多個整數想加的形式,並輸出有所劃分方法的數量。
例:6的劃分:
6=5+1
6=4+2
6=4+1+1
6=3+3
6=3+2+1
6=3+1+1+1
6=2+2+2
6=2+2+1+1
6=2+1+1+1+1
6=1+1+1+1+1+1
遞迴轉移方程:
實現:
int split(int n,int m)
現在增大難度,輸出所有的劃分方式:
#include using namespace std;
stringstream ss;
int split(int n, int m, string s)
for (int i = 1; i <= n && i <= m; i++)
}int main()
int main()
5.漢諾塔問題
數學描述就是:
有三根桿子x,y,z。x桿上有n個(n>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至y杆:
每次只能移動乙個圓盤;
**不能疊在小盤上面。
遞迴思想:
將x桿上的n-1個圓盤都移到空閒的z桿上,並且滿足上面的所有條件
將x桿上的第n個圓盤移到y上
剩下問題就是將z桿上的n-1個圓盤移動到y上了
#include #include using namespace std;
int cnt;
void move(int id, char from, char to)
void hanoi(int n, char x, char y, char z)
int main()
演算法設計與分析 遞迴
遞迴是一種技術手段,並不嚴格算是一種演算法,是指程式直接間接呼叫自身的程式設計技巧。遞迴需要有邊界條件,遞迴前進段和遞迴返回段。1 當邊界條件不滿足時,遞迴前進 2 當邊界條件滿足時,遞迴返回。ps 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,成為遞迴出口,否則將無限進行下去 遞迴的缺點 遞迴演...
演算法分析與設計3 遞迴
任何乙個可以用計算機求解的問題所需的計算時間都與其規模n有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。如果原問題可分割成k個子問題 1 k n 且這些子問題都可解,並可利用這些子問...
演算法分析與設計 遞迴與尾遞迴
什麼是遞迴?遞迴最恰當的比喻,就是查詞典。我們使用的詞典,本身就是遞迴,為了解釋乙個詞,需要使用更多的詞。當你查乙個詞,發現這個詞的解釋中某個詞仍然不懂,於是你開始查這第二個詞,可惜,第二個詞裡仍然有不懂的詞,於是查第三個詞,這樣查下去,直到有乙個詞的解釋是你完全能看懂的,那麼遞迴走到了盡頭,然後你...