题目:现在要求输入一个整数n,请你输出斐波那契数列的第n项。
斐波那契数列定义:f(n)=f(n-1)+f(n-2) n>1
f(n)=0 n=0
f(n)=1 n=1
求解:
1.递归求解
public static long fibonacci(int n) {
if(n==0) return 0;
if(n==1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
递归效率较差,很多计算时重复的。
2.动态规划,从下往上计算,依次计算f(2)、f(3)...到f(n)
public static long fibonacci_long(int n) {
if(n==0) return 0;
if(n==1) return 1;
int fibNMinusOne=1;
int fibNMinusTwo=0;
int fibN=0;
for(int i=2;i<=n;i++) {
fibN=fibNMinusOne+fibNMinusTwo;
fibNMinusTwo=fibNMinusOne;
fibNMinusOne=fibN;
}
return fibN;
}
拓展题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:n级的跳法为f(n),跳到n级要么跳两级要么跳一级跳了两次,因此f(n)=f(n-1)+f(n-2)
n=1 f(n)=1 ,n=2 f(n)=2
java实现:
public int JumpFloor(int target) {
if(target<=0) return 0;
if(target==1) return 1;
if(target==2) return 2;
int fibNMinusOne=2;
int fibNMinusTwo=1;
int fibN=0;
for(int i=3;i<=target;i++) {
fibN=fibNMinusOne+fibNMinusTwo;
fibNMinusTwo=fibNMinusOne;
fibNMinusOne=fibN;
}
return fibN;
}