下面小編就為大家帶來一篇基於JS遞歸函數細化認識及實用實例(推薦)。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
程式呼叫自身的程式設計技巧稱為遞歸( recursion)。
一個過程或函數在其定義或說明中又直接或間接地呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉換為一個與原始問題相似的規模較小的問題來求解,遞歸策略只需少量的程式就可描述出解題過程所需的多次重複計算,大大減少了程式的程式碼量。遞歸的能力在於用有限的語句來定義物件的無限集合。用遞歸思想寫出的程序往往十分簡潔易懂。
一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴回傳段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
注意:
(1) 遞歸就是在過程或函數裡呼叫自身;
(2) 在使用遞增歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口,否則將無限進行下去(死鎖)。
遞迴演算法一般用來解決三類問題:
(1)資料的定義是依遞歸定義的。 (Fibonacci函數)
(2)問題解法依遞歸演算法實作。 (回溯)
(3)資料的結構形式是依遞歸定義的。 (樹的遍歷,圖的搜尋)
遞歸的缺點:
#遞迴演算法解題的運作效率較低。在遞歸呼叫的過程當中系統為每一層的返回點、局部量等開闢了堆疊來儲存。遞歸次數過多容易造成棧溢位等。
遞歸函數趣味實例:
1、古典問題-有一對兔子,出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問第三年每個月的兔子總數為多少? (提示:兔子的規律為數列1,1,2,3,5,8,13,21....)
class Program { static void Main(string[] args) { Program p = new Program(); Console.WriteLine(p.tuzi(7)); } public int tuzi(int n) { if (n == 1 || n == 2) { return 1; } else { return tuzi(n - 1) + tuzi(n - 2); } } }
2、趣味問題—年齡。有5個人坐在一起,問第五個人幾歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後問第一個人,他說10歲。請問第五個人多大?用遞歸演算法實作。
class Program { static void Main(string[] args) { Program p = new Program(); Console.WriteLine( p.age(5)); } /// <summary> /// 递归法求岁数 /// </summary> /// <param name="n">有几个人</param> /// <returns></returns> int age(int n) { int c; if(n==1) return 10; else { c = age(n-1)+2; return c; } }
3、 趣味問題——猴子吃桃子。海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑證分成五份,多了一個,這隻猴子把多的一隻丟入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,問海灘上原來最少有幾個桃子?
程式碼:
class Program { static void Main(string[] args) { Program p = new Program(); Console.WriteLine( p.PeachNumber(5)); } /// <summary> /// 递归法求桃子数 /// </summary> /// <param name="n"></param> /// <returns></returns> int PeachNumber(int n) { if (n == 1) { //最后一个是至少是六个 return 6; } else { return (PeachNumber(n - 1) + 1) * 5; } }
以上是JavaScript中遞歸函數的細化認識以及範例程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!