一只青蛙一次可以跳上 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 之间的随机数
这种解法后面补充