经典青蛙跳台阶问题与汉诺塔问题

一只青蛙可以一次跳一个台阶,也可以一次跳两个台阶。

问青蛙跳到第n个台阶有多少种方法。

青蛙跳到第一个台阶的方法有【1】——1种

青蛙跳到第二个台阶的方法有【1,1】【2】——2种

青蛙跳到第三个台阶的方法有【1,1,1】【1,2】【2,1】——3种

青蛙跳到第四个台阶的方法有【1,1,1,1】【1,1,2】【1,2,1】【2,1,1】【2,2】5种

青蛙跳到第五个台阶的方法有【1,1,1,1,1】【1,1,1,2】【1,1,2,1】【1,2,1,1】【2,1,1,1】【2,2,1】【1,2,1】【2,1,2】——8种

.......

{(1),1,2,3,5,8,13,21,34,55........n}

联想斐波那契数列

不难得出青蛙跳到第n个台阶的方法就是斐波那契数列的第n+1项值

那我们写一个斐波那契数列的代码

#include <stdio.h>
int Fib(int n)           //采用递归的方式查找斐波那契数列的第n项
{
int ret = 0;
    if(n<=2)
    return 1;
    if(n>2)
    ret = Fib(n-1) + Fib(n-2);
    return ret;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("青蛙的方法有 %d种",ret);
return 0;
}

请分别查找第5项,第9项,第50项.

结果是:第5项,第9项都能成功查找。但是第50项却崩溃了。

不妨在n==3处设置每当n==3,记录一次

试试以下代码

#include <stdio.h>
int count = 0;    //这里用count计算一下次数
int Fib(int n)
{
    if(n==3)
        count++;
    int ret = 0;
    if(n<=2)
    return 1;
    if(n>2)
    ret = Fib(n-1) + Fib(n-2);
    return ret;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("青蛙的方法有 %d种\n",ret);
printf("n==3一共计算了%d次\n",count);     //并将其打印出来
return 0;
}

当我们找n=40时可见n==3重复了390w次

 当我们用递归的时候,n项需要找n-1,n-2.

n-1需要找n-2,n-3.          n-2需要找n-3,n-4

则n项将n==3重复了n^(n-2)次

如果我们采用递归的方法查询则效率过低。

这时候可以采用循环递推

#include <stdio.h>
int Fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 1;       //当n取1,2时不符合我们的循环判断,c取1正好作为n=1,n=2的return值
    int i = 0;
    for (i=n; i>2; i--)
    {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}

int main()
{
    int n = 0;
    int ret = 0;
    scanf("%d",&n);
    ret = Fib(n);
    printf("%d\n",ret);
    return 0;
}

青蛙种类数列与斐波那契数列的差别就是后者首位多一项1,所以青蛙n项种数为斐波那契数列的n项加1.

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高贵的bit人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值