天天看點

遞歸解決斐波那契數列

1、什麼是遞歸?

  遞歸:遞歸是方法定義調用方法本身的現象。遞歸舉例如下:

2、遞歸的注意事項?

(1)遞歸一定要有出口。否則就會死遞歸。

  上面舉例用的遞歸就是一個死遞歸,方法永遠都在進行自身調用,最終一定會陷入記憶體崩潰。是以遞歸要定義出口,就是結束遞歸的條件。舉例如下:

  這個例子就是給show方法傳遞一個參數,每次遞歸參數減1,當參數為0時,退出。

(2)遞歸的次數不要過多,否則調用方法太多會導緻記憶體空間溢出。

(3)構造方法不能使用遞歸的方式調用。

3、生活中存在的遞歸與遞歸思想?

  程式設計思想來源于生活,生活中有很多的遞歸小例子,例如小時候經常聽的故事:

  從前有座山,山上有座廟,廟裡有個老和尚,老和尚給小和尚講故事:從前有座山,山上有座廟,廟裡有個老和尚,老和尚給小和尚講故事:從前有座山,山上有座廟,廟裡有個老和尚,老和尚給小和尚講故事。。。。。

  這就是遞歸了,可惜這個故事沒有遞歸出口。。。

  遞歸的思想:程式設計取材于生活然後解決特定問題,在程式設計中遞歸是将大問題分解成若幹的小問題,然後再将小問題分解成更小的問題,直到分解的問題是已知的結論。

4、練手:用遞歸求5!

  分析:(1)規律 :n!=n(n-1)!   (2)出口:當遞歸到1!時是已知的,1!=1。

  思路:将5!分解為5*4!;再将5*4!分解為5*4*3!。。。如圖:

遞歸解決斐波那契數列

  代碼展現:

  對于階乘方法來說,求n的階乘,就傳回n*(n-1)!,展現在遞歸上就是n*jc(n-1),當遞歸到1時,傳回1。這個過程在記憶體中解析應該是:

  diguidemo類被加載到方法區中,當執行此類時,首先将main方法調用到棧中執行,main方法中還有jc(num)方法,于是接下來調用jc(num)方法,因為jc方法遞歸直到1,是以調用順序為:main--jc(5)--jc(4)--jc(3)--jc(2)--jc(1)。因為棧這種資料結構的特點是先進後出,是以方法的執行順序是jc(1)--jc(2)--jc(3)--jc(4)--jc(5)然後傳回給main方法。記憶體圖如下:

遞歸解決斐波那契數列

  jc(1)是已知的值為1,是以将1 return 給jc(2),因為棧中調用特點為調用結束後被調用者就在棧中消失,是以這些方法會按jc(1)--jc(2)--jc(3)--jc(4)--jc(5)--main順序依次return 回值并在棧中依次消失。

5、遞歸解決斐波那契數列。

  需求:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死, 問第二十個月的兔子對數為多少? 

  分析:因為每對兔子從第三個月開始每個月生一對小兔子,那麼第一個月有1對;第二個月1對;第三個月2對;第四個月3對;第五個月5對。。。

  得到這樣的一個數列:1,1,2,3,5,8,13,21。。。

  規律:從第三項開始,每一項是前兩項之和。

  出口:出口一般都定義為已知的值,因為規律是從第三個月開始的,是以這裡第一項和第二項是已知的。

  代碼實作:

  小結:遞歸是方法調用方法本身的情況,利用遞歸可以解決一些能夠将問題分解成小問題的情況。但是注意遞歸一定要有出口,并且遞歸次數不宜過多。

遞歸解決斐波那契數列

繼續閱讀