斐波那契數列的概念(下面的知識點來自百度百科)
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,
指的是這樣一個數列: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*)
在現代物理、准晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1963年起出版了以《斐波納契數列季刊》為名的一份數學雜志,用於專門刊載這方面的研究成果。
話不多說下面開始給大家上菜:
方法1,毋容置疑,這道題用遞歸是多么的完美呀。
java中的遞歸的代碼1:
public class Solution {
public int Fibonacci(int n) {
if(n==0)return 0;
if(n==1)return 1;
if(n<0)return n;
return Fibonacci(n-1) + Fibonacci(n-2);
}
}
但是這樣同時帶來的時間和空間的花費是非常的大的。
java中的遞歸的代碼2:
public
class
Solution {
public
int
Fibonacci(
int
n) {
return
Fibonacci(n,
0
,
1
);
}
private
static
int
Fibonacci(
int
n,
int
acc1,
int
acc2){
if
(n==
0
)
return
0
;
if
(n==
1
)
return
acc2;
else
return
Fibonacci(n -
1
, acc2, acc1 + acc2);
}
}
在這個里面用到的遞歸,是將自己的程序進行分離出去到了另外的一個子函數中去。這樣的做法也是非常的nice的。
這里的遞歸少了一層,所以。還算是比較的不錯吧,時間大大相對於上一個減少了很多,但是空間上面還是花費了非常的多的時間。所以也是不是特別的可取。
下面的解答是要用循環進行解答。循環進行解答,在這個里面大大的縮短了時間和空間。
public class Solution {
public int Fibonacci(int n) {
int pre1=0;
int pre2=1;
int sum =0;
if(n==0)return 0;
if(n==1)return 1;
if(n<0)return n;
if(n>1)
{
for(int i=1;i<n;i++){
sum=pre1+pre2;
pre1=pre2;
pre2=sum;
}
}
return pre2;
}
}
喜歡的小伙伴,歡迎留言哦。沒有最全,只有更全。如果你有更加好的方法的話,歡迎在我的博客下面進行留言。這樣我們互相成就。但是謝絕抄襲。如果轉載附上我的地址。
