斐波那契数列
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
思路:
1.最容易想到的就是递归了,但是因为每计算一个数时都得重复一遍迭代,给个大数容易超时,代码如下:
public int Fibonacci(int n) {
if(n <=2) return 1;
else return this.Fibonacci(n-1)+this.Fibonacci(n-2);
}
输入==n=45==时,输出为
1134903170
==time:7475==
2.维护一个数组,存储斐波那契数列,代码如下:
public long Fibonacci(int n,long[] fs) {
int index = n-1;
if(fs[index] != 0){
return fs[index];
}
if(n <=2){
fs[index] = 1;
}
else{
fs[index] = Fibonacci(n-1, fs)+Fibonacci(n-2, fs);
}
return fs[index];
}
public long Fibonacci(int n) {
long[] fs = new long[n];
return Fibonacci(n, fs);
}
输入为==5000==,输出为
535601498209671957
==time:2==
3.只存储最后两个数列值,代码如下:
public long Fibonacci(int n,long[] fs) {
int index = n%2;
if(fs[index] != 0){
return fs[index];
}
if(n <=2){
fs[index] = 1;
}
else{
fs[index] = Fibonacci(n-1, fs)+Fibonacci(n-2, fs);
}
return fs[index];
}
public long Fibonacci(int n) {
long[] fs = new long[2];
return Fibonacci(n, fs);
}
输入为==5000==,输出为
535601498209671957
==time:2==
4.直接循环计算第n个数,代码如下:
public long Fibonacci(int n) {
if(n <=2){return 1;}
else{
long a = 1 ;
long b = 1 ;
long sum = 0;
while(n-- != 2){
sum = a+b;
a=b;
b=sum;
}
return sum;
}
}
输入n===5000==时,输出为
535601498209671957
==time:1==