方法一: 遞迴法
int
fib(
int n)
遞迴法的時間複雜度為o(2^n)。
遞迴演算法的程式看上去很簡潔,但實際上執行起來卻不如此,深度的遞迴會占用很多棧空間,容易造成溢位。另外在遞迴計算fibonacci數列過程中有很多重複計算。比如,計算f(5)需要計算f(4),f(3)。計算f(4)時又要計算一遍f(3)。在n數字很大時,這樣重複的計算非常耗時且沒有意義。
方法二: 遞推法(借用陣列儲存)
解決方法就是使用乙個陣列將算過的數儲存起來,將遞迴法轉為遞推法。如果需要計算f(n),我們就從f(0)開始計算,一直計算到f(n)。
這樣就消除了重複計算,因為每次計算新值都是從之前計算過的陣列中取。遞推法的時間複雜度為 o(n2),空間複雜度為 o(n)。
int
fibonacci
(int n)
return f[n]
;}
方法三: 遞推法優化(不用陣列)
遞推法其實還能夠進行優化,可以不再使用陣列儲存,分析一下:在計算f(n)時我們只需要知道f(n-1)和f(n-2)兩個值即可,即只保留陣列中最後倆數即可,前面的元素已經沒有存在的必要。因此我們使用兩個變數來儲存需要計算出f(n)的前兩個元素即可。
int
fibonacci
(int n)
return ans;
}
分別用k和tmp儲存我們需要的兩個值,初始k代表 f(0),ans代表f(1), 令tmp=k臨時儲存f(0),k儲存f(1),計算f(2) = f(0) + f(1),即ans=k + tmp,當計算完f(2)後 ,f(0)的值我們已經不需要了,此時為了計算f(3)我們需要的是f(1)和剛剛計算好的f(2), 重複上述步驟,令tmp=k臨時儲存f(1),k儲存剛剛計算好的f(2)的值ans,然後計算f(3) = f(2) + f(1),即ans=k + tmp。依次類推…
優化後演算法的空間複雜度為o(1)。
斐波那契 Fibonacci 數列
實踐證明,尾遞迴 確實比普通遞迴效率高。下面的例子 用 普通遞迴需要10s完成 而用尾遞迴,只用了1s不到 package com.zf.dg 題目 有一種母牛,出生後第三年,開始生育,每年都生一頭 母牛 貌似單性生育,這裡就沒公牛什麼事兒 生出來的小母牛也符合同樣的規律,出生後第三年,開始生 育,...
Fibonacci 斐波那契數列
一 介紹 在數學上,費波那契數列是以遞迴的方法來定義 0 f 0 1 f 1 f f f f f n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis中...
斐波那契數列(Fibonacci)
斐波那契數列 無窮數列 1,1,2,3,5,8,13,21,34,55.稱為fibonacci數列。它可以定規地定義為 n 0,1 f n 1 n 1 f n f n 1 f n 2 這是乙個遞迴的關係式,它說明當n大於1時,這個數列的第n項的值,是它前面兩項的和,它用兩個較小的自變數的函式值來定義...