Hello,屁民。今天總結遞歸算法,
遞歸是十分耳熟能詳的一種算法類型,也是一種暴力(我猜的)算法。但是其解題的效率相對較低,佔用空間資源較多。
參考:
https://blog.csdn.net/allenchenhh133/article/details/80291252
https://blog.csdn.net/qmdweb/article/details/80537602
https://blog.csdn.net/bobbypollo/article/details/79891556
概念
遞歸算法(英語:recursion algorithm)在計算機科學中是指一種通過重複將問題分解爲同類的子問題而解決問題的方法。(百度百科)
直接或者間接調用自身的算法。將一個大的問題層層轉換爲與原問題相似的較小的問題,直到有解,然後將小問題的解一步步返回到原問題得到最終解。
最重要的一點就是,大的問題假設小問題已經解決!基於已經解決的小問題再進行處理當前問題。最小問題的解即爲邊界條件。通過已解決的小問題解大問題的過程就是遞歸方程。
在算法中使用遞歸,往往會使得算法看起來簡潔,易於理解。
比喻如下
兒子:爸爸,爲什麼要吃蔬菜?
爸爸:吃蔬菜是爲了補充維生素。
兒子:爲什麼要補充維生素?
爸爸:爲了長高。
兒子:爲什麼要長高?
爸爸:這樣你們班的娜娜就喜歡你了。
兒子:原來是這樣,那再給我炒一盤好嗎。
Fibonacci
最經典的遞歸無疑。
無窮數列 1,1,2,3,5,8,13,21,34,55,89,... ,稱爲Fibonacci數列。可以使用遞歸表示,
n = 0, n = 1 是邊界條件,當 n >= 2 時是遞歸方程。二者構成遞歸算法的基本元素。
二叉樹的先序遍歷
與Fibonacci數列一樣典型的遞歸問題。不同於普通的遞歸算法,二叉樹先序遍歷每層需要調用兩次遞歸
遞歸與棧
遞歸就是出入棧。
由前面的講解大概可以看出,求解過程就是先入後出,類似於棧處理過程。
我們知道函數調用是將函數放入函數棧中,當遞歸調用的層數過於深就會導致棧溢出而死機。所以,雖然遞歸調用看起來優雅,但是老司機看重的不是優雅,而是高效(風騷)。
既然遞歸調用有這樣致命的缺點,我們就會想將遞歸函數非遞歸化,這個後面再聊。
遞歸複雜度判定定理(Master定理)
參考分治算法