思路:
不会。
 
 
 
答案:
法1:递归
当n=1时,只需跳一次,因此f(1)=1
当n=2时,可以先跳一级再跳一级,也可以直接跳两级,因此可以记作f(2)=2
当n=3时,可以从一级台阶跳两步,也可以二级台阶跳1步,因此是f(3)=f(2)+f(1)
...
同理,n级台阶有f(n)=f(n-1)+f(n-2)种跳法(n>2时)
 
public static int JumpFloor(int n){
    if(n<3){
        return n;
    }else{
        return JumpFloor(n-1)+JumpFloor(n-2);
    }
}
 
 
法2:非递归,减少重复计算
由于递归产生了很多重复计算,若是有重复的不计算直接拿结果,就能减少不少时间
这个方法采用一个数组,记录计算过的f(n)
 
public int JumpFloor(int n){
    if(n<=1) return 1;
    int[] dp = new int[n+1];
    dp[1]=1;//n=1和n=2的时候f(n)都是1
    dp[2]=1;
    for(int i = 3;i<=n;i++){
        dp[i] = dp[i-1]+dp[i-2];//dp[n]记录的数值就是f(n)的值
    }
    return dp[n];
}

 

3.优化方法2
因为上面那个用数组存储f(n)的方法,主要是依赖当前n的前两个值,n-1和n-2,因此只需要两个临时变量可以替换掉数组
 
public int JumpFloor(int n){
    if(n<2)
        return n;
    int first = 1,second = 2,sum =0;
    while(n-- >2){
        sum = first + second;//first就是f(n-1)的值,second就是f(n-2)的值
        first = second;
        second = sum;//替换掉之后,下一次又相加
    }
    return sum;
}

 

4.公式计算(变态)
 

 

 

    public static int JumpFloor(int n) {
        double sqrt = Math.sqrt(5);
        return (int) ((Math.pow((1 + sqrt) / 2, n + 1) - Math.pow((1 - sqrt) / 2, n + 1)) / sqrt);
    }

 

 
 
 
 
 
posted on 2022-07-31 18:45  Jolyne123  阅读(256)  评论(0编辑  收藏  举报