原文:
遞迴:你開啟面前這扇門,看到屋裡面還有一扇門。你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,你繼續開啟它。若干次之後,你開啟面前的門後,發現只有一間屋子,沒有門了。然後,你開始原路返回,每走回一間屋子,你數一次,走到入口的時候,你可以回答出你到底用這你把鑰匙開啟了幾扇門;
迴圈:你開啟面前這扇門,看到屋裡面還有一扇門。你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門(若前面兩扇門都一樣,那麼這扇門和前兩扇門也一樣;如果第二扇門比第一扇門小,那麼這扇門也比第二扇門小,你繼續開啟這扇門,一直這樣繼續下去直到開啟所有的門。但是,入口處的人始終等不到你回去告訴他答案。
上面的比喻形象地闡述了遞迴與迴圈的內涵
定義:在數學和電腦科學中,遞迴是指在函式的定義中,使用函式自身的方法。實際上,遞迴顧名思義,其中包含了兩個意思:遞 和 歸,這就是遞迴思想的精華所在。
遞迴思想精髓:
正如上面所描述的場景,遞迴就是有去(遞去)有回(歸來),如下圖所示。
「有去」是指:遞迴問題必須可以分解為若干個規模較小,與原問題形式相同的子問題,這些子問題可以用相同的解題思路來解決,就像上面例子中的鑰匙可以開啟後面所有門上的鎖一樣;
「有回」是指 : 這些問題的演化過程是乙個從大到小,由近及遠的過程,並且會有乙個明確的終點(臨界點),一旦到達了這個臨界點,就不用再往更小、更遠的地方走下去。最後,從這個臨界點開始,原路返回到原點,原問題解決。
遞迴三要素:
(1)明確遞迴終止條件;
我們知道,遞迴就是有去有回,既然這樣,那麼必然應該有乙個明確的臨界點,程式一旦到達了這個臨界點,就不用繼續往下遞去而是開始實實在在的歸來。換句話說,該臨界點就是一種簡單情境,可以防止無限遞迴。
(2)給出遞迴終止時的處理辦法;
我們剛剛說到,在遞迴的臨界點存在一種簡單情境,在這種簡單情境下,我們應該直接給出問題的解決方案。一般地,在這種情境下,問題的解決方案是直觀的、容易的
(3)提取重複的邏輯,縮小問題規模。
我們在闡述遞迴思想內涵時談到,遞迴問題必須可以分解為若干個規模較小、與原問題形式相同的子問題,這些子問題可以用相同的解題思路來解決。從程式實現的角度而言,我們需要抽象出乙個乾淨利落的重複的邏輯,以便使用相同的方式解決子問題。
(4)邊界條件和遞推通式是遞迴定義的兩個基本要素,缺一不可
①邊界條件:至少有一條初始定義是非遞迴的,如漢諾塔的h(0)=0,階乘的0!=1。
②遞迴通式:由已知函式值逐步計算出未知函式值,如漢諾塔的h(0)=0,可以推算出h(1)=h(0)+1+h(0)。
遞迴演算法的程式設計模型
模型一: 在遞去的過程中解決問題
function recursion(大規模)else
}
模型二: 在歸來的過程中解決問題
function recursion(大規模)else
}
遞迴 演算法學習
遞迴按照遞迴方式可以分為直接遞迴和間接遞迴 1.直接遞迴 遞迴過程p直接呼叫自己 2.間接遞迴 p包含另乙個過程d,而d又呼叫p 遞迴例項 1.漢諾塔問題 include include void hanoi int n,char a,char b,char c int main void 2.八皇...
遞迴演算法學習
所謂的遞迴函式就是在函式體內呼叫本函式。使用遞迴函式一定要注意,處理不當就會進入死迴圈。遞迴函式只有在特定的情況下使用 比如階乘問題 遞迴演算法測試 10的階乘 function f num else console.log 10 的結果為 f 10 請實現乙個fibonacci函式,要求其引數和返...
演算法學習之演算法的理解
歷史程序中,我們都是在不斷的去分析問題,解決問題。演算法是一系列解決問題步驟 方案。演算法的特徵 有窮性 finiteness 演算法的有窮性是指演算法必須能在執行有限個步驟之後終止。理解 演算法執行之後都是有結束點的,不存在死迴圈和永遠執行下去的演算法,是可以求到結果的。演算法必須在有限時間內完成...