day 4
斐波那契數列都很熟悉了。
斐波那契數列(fibonacci sequence),又稱**分割數列、因數學家列昂納多·斐波那契(以兔子繁殖為例子而引入,故又稱為「兔子數列」,指的是這樣乙個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞推的方法定義:f(1)=1,f(2)=1, f(n)=f(n-1)+f(n-2)(n>=3,n∈n*)。
題目僅僅是更改為0、1、1、2、3、8、13、21、34而已
一開始,就想著直接寫就是:
public
class
solution
else
if(n==
0||n==1)
else
}}
嗯,太年輕了。
然後想能不能優化下遞迴,因為遞迴會重複計算大量相同資料。
遞迴因為要不斷地呼叫函式自身,呼叫函式就伴隨著引數以及函式區域性變數入棧,當遞迴層數較大容易產生棧溢位,所以通常需要我們使用迴圈優化遞迴演算法。只需要將前面的暫存就行了。
優化如下:
public
class
solution
if(n==1)
for(
int i=
2;i<=n;i++
)return fn;
}}
其實就是如下很簡單的乙個迴圈,
新的f1+f2 f2就是新的f1 fn就是新的f2;
0、1、1、2、3、5…
f1 f2 fn
0 + 1 = 1
1 + 1 = 2
1 + 2 = 3
…解決了大量的重複計算。
js補充:
function
getfib
(n)return n3;
}
1、遞迴(普通版)
function
fibonacci
(n);
return
fibonacci
(n -1)
+fibonacci
(n -2)
;}
2.遞迴(優化版)
function
fibonacci2
(n , ac1 =
1, ac2 =1)
;return
fibonacci2
(n -
1, ac2, ac1 + ac2)
;}
劍指offer 斐波那契數列
題目1描述 寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下 f n 0 n 0 f n 1 n 1 f n f n 1 f n 2 n 1 分析描述 在大多數的c語言教科書中,一般會用遞迴求斐波那契數列。如下 long long fibonacci unsigned int n ...
劍指offer 斐波那契數列
記錄來自 劍指offer 的演算法題。題目如下 寫乙個函式,輸入n,實現斐波那契數列的第n項。斐波那契數列的定義如下 f n 01 f n 1 f n 2 n 0 n 1n 1 教科書上通常在介紹遞迴的時候都會使用斐波那契數列作為例子,然後給出下列解法 long long fibonacci uns...
劍指offer 斐波那契數列
現在要求輸入乙個整數n,請你輸出斐波那契 fibonacci 數列的第n項。此題易用遞迴來實現 public intfibonacci int n 但是上述的遞迴解法有很嚴重的效率問題。以求解 f 10 為例,想求得 f 10 需要先求得 f 9 和 f 8 同樣,想求得 f 9 需要先求得 f 8...