题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n≤39
题解
1. 递归法
斐波那契数列的标准公式为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
根据公式可以直接写出:
/**
* 方法一:只用递归处理
*
* @param n
* @return
*/
public static int Fibonacci(int n) {
if (n == 0 || n == 1) return n;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
2. 优化递归
递归会重复计算大量相同数据,我们用个数组把结果存起来
/**
* 方法二:由题意可以知道n<=39创建数组每次计算存下来即可
*
* @param n
* @return
*/
public static int Fibonacci2(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
int[] arr = new int[40];
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
运行时间减少了,但是内存依旧占用很大
3. 优化存储
可以发现每次就用到了最近的两个数,所以我们可以只存储最近的两个数
- num 存储第 n 项的值
- one 存储第 n-1 项的值
- two 存储第 n-2 项的值
/**
* 第二种方法占空间,继续优化
*
* @return
*/
public static int Fibonacci3(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
int num = 0;//记录结果
int one = 0;//第一个数
int two = 1;//第二个数
while ((n - 1) > 0) {
num = one + two;
one = two;
two = num;
n--;
}
return num;
}
4. 继续改造
我们已知前两项的值,然后我们就可以用前两项的值求出第3项的值,接着求第4、第5、……,直到求出第n项的值。
public int Fibonacci4(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
int num = 1;//记录结果,也记录上一个数
int one = 0;//第一个数
while ((n - 1) > 0) {
num = one + num;
one = num - one;
n--;
}
return num;
}