青蛙跳台阶的本质---斐波那契数列

一只青蛙一次可以跳上 1 个或 2 个台阶,假如输入一个数 n 代表台阶数,求青蛙跳上这 n 阶台阶有多少种不同跳法

1.斐波那契数列了解

看这之前先了解一下斐波那契(qi)数列:
(不废话,说重点)

斐波那契数列:1,1,2,3,5,8,13,21,34,55,89…
从第三项开始,每一项等于前两项数字之和
递归的形式来定义:
F(1)=1 ; F(2)=1 ; F(n)=F(n-1)+F(n-2)

1.1代码实现:用递归找斐波那契数

下面写进代码理解一下:
多组输入,输入一个数 n ,找出第 n 个数的斐波那契数:

#include<stdio.h>
int Fib(int n)
{
 if(n<=2)
  return 1;
  else
  return Fib(n-1)+Fib(n-2);
}

int main()
{
  int n=0;
  while(scanf("%d",&n)!=EOF)
  {
    int i=Fib(n);
    printf("第%d个斐波那契数是%d\n",n,i);
  }
 return 0;
}

在这里插入图片描述

1.2递归中的问题

注意:把求斐波那契数的代码用递归写只是为了方便了解,但递归有致命的问题:效率太低,容易栈帧溢出
在这里插入图片描述

假如求第5个,那么第3个斐波那契数要求 2 次
求第 7 个,那么第3个要求 5 次
求第 40 个,第3个要求?来把代码改改看看求多少次(红方框内是上面代码添加改动的部分)
在这里插入图片描述
在这里插入图片描述
三千九百多万

所以这个情况下用迭代的问题不是栈溢出,而是效率太低
光第三个就要求 39088169 次
求斐波那契数,且较大时一定要用迭代(循环)

2.来到青蛙跳台阶的题目

一只青蛙一次可以跳上 1 个或 2 个台阶,假如输入一个数 n 代表台阶数,求青蛙跳上这 n 阶台阶有多少种不同跳法

假如第一次跳了 1 个,还剩 n-1 个台阶
假如第二次跳了 2 个,还剩 n-2 个台阶

跳第一下不同就已经决定了后面不管怎么跳,都是截然不同的情况
因此将后面的 n-1 个台阶的跳法 与 n-2 个台阶的跳法加起来,无需担心会不会有重复的情况 就是总的跳法数

下面,递归的限制条件
因为 2-2不大于0,1-2不大于0,1和2没有往前数两个数的权力
所以单独拎出来就是限制条件,及最后剩下 1 个或 2 个台阶

代码实现:

#include<stdio.h>
int Jump_Num(int n)
{
 //限制条件
  if(n==1)
  return 1;
  if(n==2)
  return 2;
  if(n>=3)
  //调用递归函数
  return Jump_Num(n-1)+Jump_Num(n-2);
}

int main()
{
  int n=0;
  while(scanf("%d",&n)!=EOF)
  {
    int i=Jump_Num(n);
    printf("有%d种跳法\n",i);
  }
 return 0;
}  
  


在这里插入图片描述
n 个台阶的跳法等于 n-1 个跳法与 n-2 个跳法之和
纯纯斐波那契数列呀
而这个巧合在于每次跳的级数: 1 或 2
如果说每次跳的级数是 1~n 之间的随机数
这种解法后面补充

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值