算法分析设计--递归算法
What’s the 遞歸算法
定義:
程序直接或間接調用自身的編程技巧稱為遞歸算法(Recursion)。
一個過程或函數在其定義或說明中又直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量
特點:
任何一個可以用計算機求解的問題所需的計算時間都與其規模n有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。
分治法的設計思想是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
如果原問題可分割成k個子問題(1<k≤n),且這些子問題都可解,并可利用這些子問題的解求出原問題的解,那么這種分治法就是可行的。
由分治法產生的子問題往往是原問題的較小模式,這就為使用遞歸技術提供了方便。
注意事項:
Why we learn this?
遞歸是搜索、分治、回溯算法的
例題:
1. Fibonacci數列
我們之前寫過遞推的方法,這次我們寫遞歸的方法。
PS:矩陣快速冪和母函數是解決此類問題的最快方式,有興趣的可以去我博客里看看。
2.集合全排列問題
排列組合的普遍復雜度就是N!
例如 給定N求 1-N的全排列問題
假設N=3 那么輸出 123 132 213 231 312 321
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遞歸轉移方程:
實現:
現在增大難度,輸出所有的劃分方式:
#include <bits/stdc++.h> using namespace std; stringstream ss; int split(int n, int m, string s) {if (m == 0){cout << s << endl;return 0;}for (int i = 1; i <= n && i <= m; i++){string s1;ss.clear();ss << i;ss>>s1;s1= s + (( s[s.size()-1]=='=')? ' ' : '+' )+s1;split(i, m - i, s1);} } int main() {int n;cin>>n;ss<<n;string s<<ss;split(n, 10, s+" ="); }4. 階乘
遞歸思想:n! = n * (n-1)! (直接看公式吧)
首先分析數列的遞歸表達式:
5.漢諾塔問題
數學描述就是:
有三根桿子X,Y,Z。X桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至Y桿:
遞歸思想:
寫在最后:
Name:風骨散人,喜歡碼代碼,碼字,目前是一名雙非在校大學生,預計考研,熱愛編程,熱愛技術,喜歡分享,知識無界,希望我的分享可以幫到你!名字的來源:我想有一天我能有能力隨心所欲不逾矩,不總是向生活低頭,有能力讓家人擁有富足的生活而不是為了生計而到處奔波。
文章主要內容:
Python,C++,C語言,JAVA,C#等語言的教程
ACM題解、模板、算法等,主要是數據結構,數學和圖論
設計模式,數據庫,計算機網絡,操作系統,計算機組成原理
Python爬蟲、深度學習、機器學習
計算機系408考研的所有專業課內容
一些程序猿常用的軟件或者黑科技什么的
目前還在更新中,先關注不迷路。微信公眾號,cnblogs(博客園),CSDN同名“風骨散人”
如果有什么想看的,可以私信我,如果在能力范圍內,我會發布相應的博文!
感謝大家的閱讀!😘你的點贊、收藏、關注是對我最大的鼓勵!
總結
以上是生活随笔為你收集整理的算法分析设计--递归算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10最常用的快捷键,效率Max提高
- 下一篇: 微星推出 999 元的 MP273QV