C语言实现青蛙跳台阶问题

目录

一、问题描述

二、思考过程

三、用递归实现

四、用循环实现

五、输出结果


一、问题描述

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

二、思考过程

n=1,有1种跳法

n=2,有2种跳法

n=3,有3种跳法

n=4,有5种跳法

n=5,有8种跳法

......

这个数列为:1,2,3,5,8,......

我们发现:第n次的跳法数为第n-1次和第n-2次之和

类似于菲波那切数列的规律

三、用递归实现

#include <stdio.h>
int Fn(int n) {
    if (n <= 2) {
        return n;
    }
    else if (n > 2) {
        return Fn(n - 1) + Fn(n - 2);
    }
}
int main() {
    int n = 0;
    printf("请输入台阶数:");
    scanf("%d", &n);
    printf("共有%d种跳法\n", Fn(n));
    return 0;
 }

使用递归实现的代码效率太低,做了很多重复的计算。

四、用循环实现

#include <stdio.h>
int Fn(int n) {
    int a = 1;
    int b = 2;
    int c = 0;
    if (n == 1) {
        return 1;
    }
    else if (n == 2) {
        return 2;
    }
    else {
        for (int i = 3;i <= n;i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}
int main() {
    int n = 0;
    printf("请输入台阶数:");
    scanf("%d", &n);
    printf("共有%d种跳法\n", Fn(n));
    return 0;
}

当输入的数较大时(如输入30),我们明显感觉到循环代码更快于递归代码。

五、输出结果

输入5

 输入20

总结

青蛙跳台阶问题本质上就是斐波那契数列问题。因此,我们遇到新问题时要联想到以前的解决方法。

有的问题既可以用循环实现,也可以用递归来实现。递归更容易被我们想到,但有时递归代码的效率会不如循环代码。因此,要根据具体情况选择合适的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值