青蛙跳台阶问题的简单实现与理解(递归实现)

简介: 青蛙跳台阶问题的简单实现与理解(递归实现)

青蛙走n阶台阶,它可以选择跳一阶或者跳两阶,那么他一共有多少种跳法?

我们先来简单看一下这个问题,并简单实现一下青蛙跳

1节台阶:跳1

2阶台阶:(1)跳1 跳1 (2)跳2

3阶台阶:(1)跳1跳1跳1 (2)跳1跳2 (3)跳2跳1

4阶台阶: (1)跳1跳1跳1跳1 (2)跳1跳1跳2 (3)跳1跳2跳1 (4)跳2跳1跳1 (5)跳2跳2

、、、、、、

、、、、、、

n阶台阶:

我们发现后面情况越来越多,计算也越来越复杂,但是当我仔细思考后不难发现

1、关于跳台阶问题,无论怎样上台阶,最后一步都会剩下两种情况:1.还有一步 2.还有两步;

2、而当台阶数小于二时,跳台阶的方法就等于台阶数目;

3、换个思维我们只需要将台阶数全化为两个台阶,然后考虑两个台阶的情况;

4、那我们就可以用递归的方法进行实现,递归结束的条件就为只剩下两个台阶的时候

5、可以将该问题简单看为:前面所走 + 最后一步

       //我们先讨论最后一步,就非常简单,

       //然后又把前面所走看为:前前面所走 + 最后一步(为到达前面所走的最后一步)

       //依次进行,向后递,当台阶数小于2时,归;

代码实现如下,不考虑溢出:

#include <stdio.h>
//关于跳台阶问题,无论怎样上台阶,最后一步都会剩下两种情况:1.还有一步 2.还有两步;
//而当台阶数小于二时,跳台阶的方法就等于台阶数目;
//换个思维我们只需要将台阶数全化为两个台阶,然后考虑两个台阶的情况;
//那我们就可以用递归的方法进行实现,递归结束的条件就为只剩下两个台阶的时候;
int Fib(int n) {
    if (n <= 2) //递归的结束条件,当还之剩下两个台阶时
    {
        return n;
    }
    else {
        return Fib(n - 1) + Fib(n - 2);//两种情况,将跳台阶简单化,层层剥离,
        //可以将该问题简单看为:前面所走 + 最后一步
        //我们先讨论最后一步,就非常简单,
        //然后又把前面所走看为:前前面所走 + 最后一步(为到达前面所走的最后一步)
        //依次进行,向后递,当台阶数小于2时,归;
    }
}
int main() {
    int n = 0;
    scanf("%d", &n);
    int ret = Fib(n);
    printf("%d\n", ret);
    return 0;
}


以上是博主初学递归,对青蛙跳台阶问题自己的理解,若有描述不对的地方,欢迎大佬们评论区指正。


相关文章
|
4月前
代码随想录——双指针(一)
代码随想录——双指针(一)
|
人工智能 算法 C++
【BFS】巧妙取量
【BFS】巧妙取量(c++基础算法)
75 1
|
12月前
|
存储
浅谈递归函数(最后一个例题:浅谈汉诺塔思路与代码)
浅谈递归函数(最后一个例题:浅谈汉诺塔思路与代码)
|
机器学习/深度学习
青蛙跳台阶(递归)
青蛙跳台阶(递归)
85 0
|
算法
力扣704二分查找:思路分析+代码实现(递归与非递归)
力扣704二分查找:思路分析+代码实现(递归与非递归)
110 0
汉诺塔?爬楼梯?斐波那契?知道递归就够了
汉诺塔?爬楼梯?斐波那契?知道递归就够了
86 0
【递归】青蛙跳台阶的变式题你还会吗?
【递归】青蛙跳台阶的变式题你还会吗?
116 0
【递归】青蛙跳台阶的变式题你还会吗?
|
存储 算法
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(三)
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(三)
|
人工智能
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(二)
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(二)
|
机器学习/深度学习
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(四)
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟
<代码随想录二刷>二分查找 | 双指针 | 滑动窗口 | 枚举模拟(四)