两个经典的函数递归问题:青蛙跳台和贝诺塔

简介: 两个经典的函数递归问题:青蛙跳台和贝诺塔

经典问题一:青蛙跳台


题目:一只青蛙可以跳上一级台阶,也可以跳上两级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法?


1.解析:


首先我们要在草稿纸上动动笔找一下规律,我们不难发现:


1级台阶:1种跳法==========》1


2级台阶:2种跳法==========》1+1 或 2


3级台阶:3种跳法==========》1+1+1 或 1+2 或 2+1


4级台阶:5种跳法==========》1+1+1+1 或 1+1+2 或 2+1+1 或 1+2+1 或 2+2:


....................................................


我们多写几组不难发现规律:从3级台阶开始,它跳法的值=前两次跳法值的和;例如:3级跳法数=2级跳法数+1级跳法数;4级跳法数=3级跳法数+2级跳法数...........我们发现,青蛙跳台问题,其实也就是斐波那契数列问题!!!


所以我们就可以写一个函数递归;这个函数名(暂定为Fib);假设有(暂定为n级)台阶;如果n>2;就递归函数Fib(n)=Fib(n-1)+Fib(n-2)====》return Fib(n-1)+Fib(n-2);如果n<=2;就直接return n就可以啦====》因为1级台阶是1种跳法,2级台阶是2种跳法,刚好是对应的。


2.具体代码:


34083077fb474f3fbf42e963f03a1754.png


3.代码解析:


有了第一步的解析;我们很容易就能读懂代码,在这里我只说一点:

递归回朔的过程;为了方便,假入为4级台阶:

2047af7bb1984f1ebf433be931727b6c.png


经典问题二:汉诺塔问题


题目:总共有三个柱子,在一根柱子上,从下往上按照大小顺序摞着n片圆盘。我们需要按大小顺序重新摆放在另一根柱子上。并且规定,在移动过程,小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。假如我们先考虑3片圆盘:


20210427074620328.gif


1.解析:


对于汉诺塔问题,我个人觉得思路容易理解,但是如果细思每一个步骤,感觉就很难理解了;所以我现在就是在一种抽象的思维理解它,而不是细思它的每一步挪动;假设有三个柱子分别为:柱子A、柱子B、柱子C;A柱子是起始柱,B是辅助柱,C是终点柱:


假如只有1个圆盘:就可以直接从柱A移动到柱C===》A->C===》移动1次


假如有2两个圆盘:就需要先把最上面小的移动到柱B,再把大的移动到C,最后再把B上的那个小的移动到C===》A->B、A->C、B->C===>移动了3次


假如有3两个圆盘:


1. 就需要先把最上面小的移动到柱C,再把中的移动到B,最后再把C上的那个小的移动到B,再把A上的大的移动到C,通过这个步骤就可以把A柱最下面的大的移动到C柱上;


2. 接下来我们就需要把B柱上的小和中,移动到C柱上,把小移动到A柱,把中移动到C柱;


3. 再把A柱上的小移动到C柱===》A->C A->B C->B A->C B->A B->C A->C===>移动了7次


.........................................................................................


下面的就不在写了,不然我自己都要迷了;这里你可能还是不太明白,所以在代码分析上我会通过画图的方式让你加深理解;我们可以总结一下简单规律,假如有n片圆盘,则需要移动-1次;这个数字是很庞大的,假如有64个圆盘,你每秒移动一次,那你需要移动多久?不妨自己动手算算,数字大的超乎你的想象!!!


2.具体代码:


18ea721a8b8d4576a262475aa0ece2e8.png


3.代码分析:


不知道大家发现没有,汉诺塔递归的奥妙所在,假设有三个柱子A、B、C;有三个圆盘为:小、中、大;从上往下看就是从小到大的规律全部都在圆盘A上:


第一步:先把小的移动到C,即A->C;再把中的移动到B,即A->B;再把小的移动到B,即C->B;最后在把大的移动到C,即A->C;第一步结束!!! 总结一下就是A->C A->B C->B A->C;


是不是就相当于把小和中当做一个整体借助C柱移动到B柱,然后把大直接移动到C柱;下面通过图来理解一下:

f80a74acf0a942628e60e88f395aa817.png



第二步:把B柱上的小中移动到C上,先把小移动到A,即B->A;在把中移动到B,即B->C;总结一下就是B->A B->C;

是不是就相当于把中借助A柱移动到C柱;下面通过图来理解一下:


96e95892b43740e78a2f56ad510d536b.png


第三步:就可以把小直接移动到C上就可以啦,即A->C;下面通过图来理解一下:

171f6e093a6d4a848c058cab9e1167e6.png


我们会发现汉诺塔的递归主要分为三个步骤:

第一步:需要先判断,如果只有一个圆盘,那么直接从A柱移动到C柱;

第二步:如果n>2;那么直接把n-1个圆盘借助于C柱移动到B柱;在把剩下的一个直接移动到C柱;

第三步:最后在在把B柱上的n-1个圆盘,借助于A柱移动到C柱;


80bc6df28f9e4221ae51bc8a07756956.png

总结:作为函数递归的两个经典例题,我们要多动手画图,分析一下它递归的过程,多刷题,培养这种递归思想,一起加油吧!!!  


结束语


今天的分享就到这里,想要提升编程思维的,快快去注册牛客网开始刷题吧!各种大厂面试真题在等你哦!

💬刷题神器,从基础到大厂面试题👉点击跳转刷题网站


184068dc41e94efbb14e555f972eaa17.png

相关文章
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
604 214
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
843 61
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1247 157
|
4天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
239 138
|
7天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
521 109