斐波那契数学公式
算法问题:青蛙跳台阶
一直青蛙一次可以跳上 1 级台阶,也可以跳上二级台阶。
求该青蛙跳上一个 n 级台阶总共有多少中跳发。
解:
- 若只有一层台阶,则只有一种跳法
- 若有两层台阶,则有两种跳法
把 n 级台阶看作为 n 的函数,记为 f ( n ), 当 n > 2 时,第一次跳有两种不同的选择
- 只跳一层,则剩下的跳法数目等于 n - 1 级台阶的跳法数目
- 跳两层,则剩下的跳法数目等于 n - 2 级台阶的跳法数目
因此 n 级台阶的不同跳法的总数为:
f(n) = f(n-1) + f(n+1)
算法实现方式
- **递归实现: **时间效率低
public static long fibonacci(int n){
if ( n <= 0){
return 0;
}
if (n == 1){
return 1;
}else if (n == 2){
return 2;
}
return fibonacci(n-1) + fibonacci(n - 2);
}
- 循环实现:提升时间效率
public static long f(int n) {
int[] result = {0, 1, 2};
if (n < 0) {
return 0;
}
if (n < 3) {
return result[n];
}
/**
* firstNum = f(n - 1)
* lastNum = f(n - 2)
*/
int lastNum = result[1];
int firstNum = result[2];
int num = 0;
for (int i = 3; i <= n; i++) {
num = firstNum + lastNum;
lastNum = firstNum;
firstNum = num;
}
return num;
}