前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【递归】青蛙跳台阶的变式题你还会吗?

【递归】青蛙跳台阶的变式题你还会吗?

作者头像
MicroFrank
发布2023-01-16 11:52:19
2380
发布2023-01-16 11:52:19
举报
文章被收录于专栏:同步文章1234同步文章1234

问题1:

如果青蛙一次只能跳一级或两级台阶,问跳到第N级台阶总共有多少方法?

解题:

跳上一级台阶,青蛙共有一种方法;0-->1,总共一种方法。

跳上两级台阶,青蛙可以一级一级跳,跳两次0-->1-->2,也可以直接跳到二级台阶,跳一次,0--->2;总共2种方法。

跳上三级台阶,青蛙可以青蛙可以一级一级跳,跳两次,0-->1-->2-->3,也可以先跳一级,然后再跳三级台阶,跳两次,0-->1--->3;也可以先跳两级,再跳一级台阶,跳两次,0-->2-->3;总共三种方法。

对于跳上三级台阶我们还可以从他跳上第三级台阶的最后一步来考虑(因为最后一步不一样,所以方法肯定不会重复),就是跳上三级台阶的方法数=跳上倒数第一级台阶的方法数+跳上倒数第二级台阶的方法数,这

那么我们便找到了普遍规律:

跳上N级台阶,得到递推公式f(n)=f(n-1)+f(n-2)

递推出口就是f(1)=1&&f(2)==2

这和斐波那契数列的结论很像,但是思考的过程却大相径庭!

代码:

代码语言:javascript
复制
#include<stdio.h>
int fabo(int n)
{
	if (n == 1) return 1;
	if (n == 2) return 2;
	if (n > 2) return fabo(n - 1) +fabo(n-2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=fabo(n);
	printf("%d", ret);
}

结果:

看到这里我相信会了青蛙一次跳一级,两级台阶,但是稍微变一下,如果是青蛙可以一次跳一级,两级,三级台阶的问题,你是不是还会呐?

问题2:

如果青蛙一次可以跳1级,或2级,......或N级台阶,问青蛙要想跳到第N级台阶总共有多少种方法?

解题:

同样从他跳上第三级台阶的最后一步来考虑(因为最后一步不一样,所以方法肯定不会重复)

最后一步青蛙可以从倒数第一级,倒数第二......第二级,第一级台阶跳上去

因此得到公式f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(2)+f(1);

同时f(n-1)=f(n-2)+f(n-3)+.....+f(2)+f(1);

得到递推公式f(n)=2*f(n-1);

代码:

代码语言:javascript
复制
#include<stdio.h>
int fabo(int n)
{
	if (n == 1) return 1;
	if (n >= 2) return fabo(n - 1) * 2;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=fabo(n);
	printf("%d", ret);
}

结果:

 问题3:

如果青蛙一次可以跳1级,或2级......或M级台阶,问青蛙要想跳到第N级台阶总共有多少种方法?(青蛙不能回跳)

解题:(分情况讨论)

1.当M>=N,因为青蛙不能回跳,所以此时问题等同于问题2;

2.当M<N,f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(n-m)

同时f(n-1)=f(n-2)+f(n-3)+....+f(n-m)+f(n-m-1);

变换一下就是f(n-1)-f(n-m-1)=f(n-2)+f(n-3)+....+f(n-m)

因此得到递推公式:f(n)=2*f(n-1)-f(n-m-1)

代码同理可以写出来,自己动手试试吧!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档