【递归】青蛙跳台阶的变式题你还会吗?
问题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
这和斐波那契数列的结论很像,但是思考的过程却大相径庭!
代码:
#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);
代码:
#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)
代码同理可以写出来,自己动手试试吧!
相关文章
- 智能网联汽车信息安全研究报告
- 浅析TSINGSEE智能边缘网关的人体检测技术及应用场景
- 为什么有些算法工程师从来不谈业务,不谈解决问题,不谈价值挖掘,开口闭口就是算法模型,炼丹调参工程化?
- 多语言站点React前端框架i18next
- 后端一次给你10万条数据应该如何展示,面试官到底考察我什么?
- 构建自组织团队,让敏捷管理更好地落地
- golang中数组和切片到底有什么区别?
- HttpClient SSL Session默认设置导致线程阻塞几分钟的案例分析
- AI通用安防深度学习算法如何赋能场景应用?
- 浅析基于云-边-端协同AI智能分析网关的算力资源智能调度能力
- 软件测试|比Selenium更加强大的Playwright
- 从 Wepy 到 Uniapp 变形记
- Zabbix与乐维监控对比分析(七)——网络功能篇
- Paste for Mac(剪切板管理工具) v3.1.5免激活版
- 技术汇总:第十三章:三级缓存
- 6大多人协作工具推荐
- 数据结构:七种哈希散列算法,你知道几个?
- 全球互联网进入IPv6主导期 IPv6标准快速演进
- 企点聊营销 | 拒绝“单打”,全域触达要有“大局观”!
- 程序员常用的几种序列化方式,总有一个是你在用的