【斐波那契函數的定義】
斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=1,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。
【用遞歸求解斐波那契函數的弊端】
斐波那契函數用遞歸實現如下面的代碼:
計算斐波那契的自然遞歸程序效率時很低的,上面的程序雖然寫法簡單,看上去時遞歸的聰明的使用,但其實效率是及其低下的。特別是當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次。
圖例-跟蹤斐波那契數的遞歸計算
程序之所以效率低下是因存在大量的冗餘的工作要做,這違反了合成效益法則(求解一個問題的同一實例是,切勿在不同的遞歸調用中做重複性工作),在第一次調用fib( n - 1 )時,其實在某處已經計算了fib( n - 2 ),fib( n - 2 )的信息沒有被存儲,導致f調用fib( n - 2 )時,又做了重複性計算,這樣遞歸重複冗餘的計算導致巨大的運行時間。
【用for循環計算代替遞歸】
由於計算 fib( n ) 所需要的是 fib( n - 1 )和fib( n - 2 ),因此,把最近算出2個的斐波那契數記錄下來,以避免重複的計算。for循環計算斐波那契數代碼如下:
【使用遞歸的四條基本法則】
使用遞歸時編寫程序時,要遵循以下4條法則,不然很容易編寫出效率很低程序。
11、基準情形。必須總要有某些基準情形,它無需遞歸就能解出。
2、不斷推進、對於需要使用遞歸求解的情形、每一次遞歸調用必須都必須使狀況向一種基準情形推進。
3、設計法則。假設所有遞歸都能運行。
4、合成效益法則。 求解一個問題的同一實力時,切勿在不同的遞歸調用中做重複性工作。