剑指offer-变态跳台阶-JavaScript

题目

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法

思路一 递归+数组

参考普通跳台阶(每次可以跳 1个 或 2 个台阶)的思路:https://blog.csdn.net/weixin_42762089/article/details/86496014

n个台阶爬楼的爬楼方法就等于 一开始爬1步的方法数 + 一开始爬2步的方法数+ ... + 一开始爬n-1步的方法数 + 一开始爬n步的方法数,建立一个数组arr来保存n个台阶的爬楼方法数,这样可以避免重复计算。

稍微改下普通跳台阶的代码即可,JavaScript代码:

function jumpFloorII(number)
{
    var arr = [0, 1, 2];
    if (number == 1 ) {
        return 1;
    } else if (number == 2) {
        return 2;
    } else {
        for(var i = 3; i <= number; i++) {
            arr.push(0);
        }
        climb(arr, number);
        return arr[number];
    }
}
function climb(arr, number)
{
    for (var i = 1; number - i > 0; i++) {
        var x = number - i;
        if (x > 2 && arr[x] == 0) {
            climb(arr, x);
        }
        arr[number] += arr[x];
    }
    arr[number] += 1;
}

思路二 递归

本题是普通跳台姐的进化版本。
原来的青蛙只可以跳上1级或2级,即F(n) = F(n - 1) + F(n - 2)
现在的青蛙可以跳上1到n的任意级,按照之前的解题思路,依然先来看F(n),对于一个n级台阶来说
青蛙第一次可以跳1级,则还剩n - 1级台阶,即F(n - 1)
青蛙第一次可以跳2级,则还剩n - 2级台阶,即F(n - 2)
...
青蛙第一次可以跳n - 1级,则还剩1级台阶,即F(1)
青蛙第一次可以跳n级,即1种跳法
F(n) = F(n - 1) + F(n - 2) + F(n - 3) + F(n - 4) + ... + F(1) + 1
很显然F(1)= 1,在已知F(1)的情况下,我们可以利用递归解这道题

JavaScript代码:

function jumpFloorII(number)
{
    var count = 1;
    for(var i = 1; i < number; i++) {
        count += jumpFloorII(number - i);
    }
    return count;
}

思路三 递归

 关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:
        f(1) = 1
        f(2) = f(2-1) + f(2-2)         //f(2-2) 表示2阶一次跳2阶的次数。
        f(3) = f(3-1) + f(3-2) + f(3-3) 
        ...

        f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n) 

说明: 

        1)这里的f(n) 代表的是n个台阶有一次1,2,...n阶的 跳法数。
        2)n = 1时,只有1种跳法,f(1) = 1
        3) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2) 
        4) n = 3时,会有三种跳得方式,1阶、2阶、3阶,
            那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)
            因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)
        5) n = n时,会有n中跳的方式,1阶、2阶...n阶,得出结论:
            f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1)
        6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:
            f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)
            f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) = f(n-1) + f(n-1)
            可以得出:
            f(n) = 2*f(n-1)
        7) 得出最终结论,在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:
                      | 1       ,(n=0 ) 
        f(n) =     | 1       ,(n=1 )
                      | 2*f(n-1),(n>=2)

JavaScript代码:

function jumpFloorII(number)
{
    if (number == 1 ) {
        return 1;
    } else {
        return 2 * jumpFloorII(number - 1);
    }
}

 

你可能感兴趣的:(算法)