题目描述:
所述 斐波那契数,通常表示为 F(n)
形式的序列,称为 斐波纳契数列,使得每个数字是两个前述者的总和,起始0
和1
。
F(0)= 0,F(1)= 1
对于N> 1.F(N)= F(N-1)+ F(N-2)
给定N
,计算F(N)
。
题目示例:
范例1:
输入: 2
输出: 1
说明: F(2)= F(1)+ F(0)= 1 + 0 = 1。
范例2:
输入: 3
输出: 2
说明: F(3)= F(2)+ F(1)= 1 +1 = 2。
范例3:
输入: 4
输出: 3
说明: F(4)= F(3)+ F(2)= 2 +1 = 3。
读题可知:
这是一个斐波那契数序列,已知条件是F(0)= 0,F(1)= 1,
思考:
F(0)= 0,F(1)= 1
对于N> 1.F(N)= F(N-1)+ F(N-2)
可以知道N>1符合公式
这一项=前二个项相加。所以这是一个三个数都在变的并且关系是F(N)= F(N-1)+ F(N-2)。
代码一(平推):
class Solution {
public int fib(int N) {
if(N < 1 || N > 92)
return 0;
int a = 1;
int b = 1;
int temp;
for(int i = 3; i <= N; i++) {
temp = a;
a = b;
b += temp;
}
return b;
}
}
代码二(递归):
/*
递归方法实现
f(n) = f(n - 1) + f(n - 2)
最高支持 n = 92 ,否则超出 Long.MAX_VALUE
@param N n
@return f(n)
*/
public static int recursion(int N) {
if(N<1) {
return 0;
}
else if(N<3) {
return 1;
}
return recursion(N-1)+recursion(N-2);
}
代码三(递归+缓存):
带有缓存的方法,比recursion方法性能好很多
static long[] l = new long[93];
static {
l[1] = 1;
}
public static long fibBuffRec(int num) {
if(num < 1 || num > 92)
return 0;
if(l[num] == 0)
l[num] = fibBuffRec(num - 1) + fibBuffRec(num - 2);
return l[num];
}