一、斐波那契数列
-
什么是斐波那契数列?
- 1,1,2,3,5,8,13…这样的数列就是斐波那契数列,通过观察不难看出,除了前两个数,其他的数都是他的前两个数相加,需要求的是第n项的值,也就是第n个数的值.
-
第一种解法
- 这个题解法感觉很简单,想到的n的值,就得到n-1的值和n-2的值就可以了对吧,想到这里是不是觉得递归写起来很舒服.确实,递归也是一种解法,来瞅一瞅代码
public static int recursion(int n) {
//当是0或者1的时候直接返回就可以
if (n <= 0) {
return 0;
}
if (n == 1) {
return 1;
}
//直接递归
return recursion(n - 1) + recursion(n - 2);
}
-
写出这个解法的你可能离offer背道而驰了,我们可以画一个图直观的看一下这个解法的过程
-
我们可以看到这个树状结构里有很多的重复内容,而且随着n的增大这些重复节点会快速增多,这显而易见不是最优解,是可以被优化的.
-
第二种解法
- 解法的思路都是一样的,都是要使用前两个值得和得到这个数,但是第二种解法是使用了循环.
public static int recursion(int n) {
if (n <= 0 ){
return 0;
}
if (n == 1 || n== 2){
return 1;
}
int one = 1;
int two = 1;
int lastN = 0;
//因为从第三个才开始递推,所以i等于3
for (int i = 3; i <= n; i++) {
//n的值是前两个数相加
lastN = one + two;
//将后一个的值给到第一个
one = two;
//将n的值给到第二个
two = lastN;
}
return lastN;
}