输出斐波那契数列列第n列
(一)题目描述
求斐波那契数列的第n项,n<=39
(二)解题思路
(1)发现问题
如果使用”递归“就会出现一个问题,递归会重复计算一些子问题,计算f(10)需要计算f(9)和f(8),计算f(9)要计算f(8)和f(7),但是f(8)已经计算过了,重复计算会导致算法的效率降低
(2)解决方法
递归是把一个问题划分成多个子问题求解,动态规划也是划分成富哦个子问题。
但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题
代码示例
public class Solution {
private int[] fibonacci=new int[40];
public Solution(){
fibonacci[1]=1;
fibonacci[2]=2;
for (int i = 2; i <= fibonacci.length; i++) {
fibonacci[i]=fibonacci[i-1]+fibonacci[i-2];
}
}
public int Fibonacci(int n){
return fibonacci[n];
}
}
青蛙跳台阶
题目描述
一只青蛙一次可以跳上1个台阶,也可以跳上2个台阶。
求青蛙跳上一个n级台阶总共有多少种跳法(先后次序不同算不同的结果)
解题思路
如果只有一个台阶,显然只有一种跳法
如果有两个台阶,那就有两种跳法:一种是一级一级跳,一种是一下跳两级
再讨论一下一般情况:
n级台阶时的跳法看成是n的函数f(n)。当n>2时,第一次跳的时候就有两种不同的选择
第一次跳一级,剩下n-1级,跳法是f(n-1)种
第一次跳两级,剩下n-2级,跳法是f(n-2)种
所以,n级台阶的不同跳法的总数为f(n)=f(n-1)+f(n-2),就能看出这是个斐波那契数列
代码示例
public class JumpFloor {
public static void main(String[] args) {
int n=4;
System.out.println("跳法的种数为:"+JumpFloor(n));
}
public static int JumpFloor(int n){
if (n<=0)
return 0;
if (n<=2)
//n级台阶
return n;
//n为1时有1种跳法
int pre2=1;
//n为2时有2种跳法
int pre1=2;
//一共多少种跳法
int result=1;
//当n>=2时,共有f(n)=f(n-1)+f(n-2)种
//下一步是f(n-1)=f(n-2)+f(n-3)
/**
* 这是循环实现
*/
/*for (int i = 2; i < n; i++) {
result=pre1+pre2;
//这样把值递进交换,就不会重复计算值了
pre2=pre1;
pre1=result;
}
return result;*/
/**
* 这是递归实现
*/
return JumpFloor(n-1)+JumpFloor(n-2);
}
}
变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级,它也可以跳上n级。
求该青蛙跳上一个n级的台阶总共有多少种跳法
解题思路
跳上n-1级台阶,可以从n-2级跳1级上去,也可以从n-3级跳2级上去
那么f(n-1)=f(n-2)+f(n-3)+…+f(0)
同样,跳上n级台阶,可以从n-1级跳上1级上去,也可以从n-2级跳2级上去,那么f(n)=f(n-1)+f(n-2)+…+f(0)
综上可得
f(n)-f(n-1)=f(n-1),即f(n)=2*f(n-1)
所以f(n)是一个等比数列
public class JumpFloorll {
public int JumpFloorll(int target){
return (int) Math.pow(2,target-1);
}
}