跳台阶问题解析

描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

数据范围:1 \leq n \leq 401≤n≤40
要求:时间复杂度:O(n)O(n) ,空间复杂度: O(1)O(1)
示例1
输入:2
返回值:2
说明:
青蛙要跳上两级台阶有两种跳法,分别是:先跳一级,再跳一级或者直接跳两级。因此答案为2
示例2
输入:7
返回值:21

 

递归解法:

public int jumpFloor (int number) {
        if(number <= 1) {
            return 1;
        }
        return jumpFloor(number - 1) + jumpFloor(number - 2);
    }

为什么f(n-1)+f(n-2)是答案,因为达到n级台阶,是 从n-1到达n级台阶所有可能 加上 从n-2到达n-1级台阶的所有可能。

深度思考就能知道,最多步数 是全为1跳台阶,然后其中两个1合并为2步数就会按1递减,也就是5阶 需要5+4+3+2+1,4阶需要4+3+2+1,正好符合斐波那契数列计算方式。所以这个递归公式只适合跳一阶或跳二阶的方式,如果包含跳三阶就不行了。

 

循环解(动态规划):

很显然,斐波那契的循环解和这一样,我认为这就是动态规划:

    public int jumpFloor (int number) {
        if (number <= 1) {
            return 1;
        }
        int s = 0, s1 = 1;
        int n = 1;
        int res = 0;
        while (n <= number) {
            res = s + s1;
            s = s1;
            s1 = res;
            n ++;
        }
        return res;
    }

 

posted @ 2023-07-26 10:55  时间羚羊  阅读(29)  评论(0编辑  收藏  举报