斐波那契數列(fibonacci sequence),又稱**分割數列、因數學家萊昂納多·斐波那契(leonardoda fibonacci)以兔子繁殖為例子而引入,故又稱為「兔子數列」,指的是這樣乙個數列:1、1、2、3、5、8、13、21、34…
此為第一種方法,用迴圈來解決這個問題,**如下:
public
static
intforfibonacci
(int n)
//定義a、b和sum用來接收值
int a=1;
int b=1;
int sum=0;
//利用for迴圈進行累加
for(
int i=
2;i)//返回sum即為所要求的第n位數的總和
return sum;
}
可以看出如上的**雖然可以求出每乙個n所對應的斐波那契數列的值,但時**相對較為繁瑣,不夠簡潔。
此時我們可以利用迭代的方式來進行對**的簡潔化
迭代的三要素:
1.找到臨界點
2.滿足臨界點的解決辦法
3.提取相同的邏輯
public
static
intiterationfibonacci
(int n)
return
iterationfibonacci
(n-1)+
iterationfibonacci
(n-2);
}
如上,**相比利用迴圈時簡潔不少,但是在計算過程中還是有許多的重複項被計算。例如:
如果我們想求的是f(5);由於f(2)=f(1)=1,故求值到f(2)和f(1)出現即可。
f(5)=f(4)+f(3)展開計算f(4)和f(3)
即又需要計算f(4)=f(3)+f(2)和f(3)=f(2)+f(1)繼續展開計算f(3)
f(3)=f(2)+f(1)
此時可以看出f(3)被展開計算了兩次,如果n足夠大,那麼被重複計算的數就越來越多,因此需要對該**進行優化
public
static
intoptimizefibonacci
(int first,
int second,
int n)
return
optimizefibonacci
(second,first+second,n-1)
;}
現有斐波那契數列:1 1 2 3 5 8 13 21 34
此時定義了兩個值,first和second
要計算第7位的斐波那契數值
這時n=7,first=1,second=1,
此時假設n作為第6位置時,(實際不變),此時first=1,second=2
繼續假設n作為第5位置時,(實際不變),此時first=2,second=3
繼續假設n作為第4位置時,(實際不變),此時first=3,second=5
繼續假設n作為第3位置時,(實際不變),此時first=5,second=8
繼續假設n作為第2位置時,此時first=8,second=13
繼續假設n作為第1位置時,此時first=13,second=21
結果返回:
當n=1時返回first的值就為所求的值
當n=2時返回second的值就為所求的值
當n=3時返回(first+second)的值就為所求的值
(故**中,當n=3時直接可以得到所要求得得斐波那契數值)
優化後的**就不存在重複計算,依舊簡潔。
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
迴圈斐波那契數列 斐波那契數列應用
什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...
斐波那契數列
1 題目描述 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項。斐波那契數列的定義如下 輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入包括乙個整數n 1 n 70 輸出 對應每個測試案例,輸出第n項斐波那契數列的值。2 這是九度上的乙個題,要求時間限制1秒,整數的...