謹慎地使用遞歸之斐波那契遞歸實現的分析


【斐波那契函數的定義】

    斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=1,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。

【用遞歸求解斐波那契函數的弊端】

    斐波那契函數用遞歸實現如下面的代碼:


wKioL1P8jbyiUwf8AABfC3Xjldc436.jpg



    計算斐波那契的自然遞歸程序效率時很低的,上面的程序雖然寫法簡單,看上去時遞歸的聰明的使用,但其實效率是及其低下的。特別是當n=40以後,效率衰減的特別明顯。爲了計算 fib( n ) ,需存在一個對 fib( n - 1 ) 和 fib( n - 2 ) 的調用,然而,由於計算F fib( n - 1 )又需要遞歸地調用 fib( n - 2 ) fib( n - 3 ),因此 fib( n - 2 ) 被計算了兩遍,跟蹤整個算法,可以發現 fib( n - 3 )被計算了33次,fib( n - 4 )被計算了55次,fib( n - 5 )被計算了88次。

    wKioL1P8ki_CuEfFAADpqGfRtwg006.jpg


                             圖例-跟蹤斐波那契數的遞歸計算

    程序之所以效率低下是因存在大量的冗餘的工作要做,這違反了合成效益法則(求解一個問題的同一實例是,切勿在不同的遞歸調用中做重複性工作),在第一次調用fib( n - 1 )時,其實在某處已經計算了fib( n - 2 ),fib( n - 2 )的信息沒有被存儲,導致f調用fib( n - 2 )時,又做了重複性計算,這樣遞歸重複冗餘的計算導致巨大的運行時間。


【用for循環計算代替遞歸】

    由於計算 fib( n ) 所需要的是 fib( n - 1 )和fib( n - 2 ),因此,把最近算出2個的斐波那契數記錄下來,以避免重複的計算。for循環計算斐波那契數代碼如下:

wKiom1P8kiqAWIQIAADDRKL9IcQ935.jpg

【使用遞歸的四條基本法則】

    使用遞歸時編寫程序時,要遵循以下4條法則,不然很容易編寫出效率很低程序。

    11、基準情形。必須總要有某些基準情形,它無需遞歸就能解出。

    2、不斷推進、對於需要使用遞歸求解的情形、每一次遞歸調用必須都必須使狀況向一種基準情形推進。

    3、設計法則。假設所有遞歸都能運行。

    4、合成效益法則。 求解一個問題的同一實力時,切勿在不同的遞歸調用中做重複性工作。

    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章