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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 两个经典的函数递归问题:青蛙跳台和贝诺塔

经典问题一:青蛙跳台


题目:一只青蛙可以跳上一级台阶,也可以跳上两级台阶。求该青蛙跳上一个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

相关文章
|
2月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
54 0
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
程序员 C语言
初阶函数经典例题(2)
初阶函数经典例题(2)
经典递归问题:汉诺塔【超详解】
经典递归问题:汉诺塔【超详解】
659 0
递归经典例题——汉诺塔
递归经典例题——汉诺塔
118 1
|
算法
解密汉诺塔问题:递归与分治的经典探索
解密汉诺塔问题:递归与分治的经典探索
600 0
初阶函数递归经典例题(1)
初阶函数递归经典例题(1)
|
设计模式 存储 测试技术
【C++】栈和队列的模拟实现 & 经典题目解析
【C++】栈和队列的模拟实现 & 经典题目解析
210 0
【C++】栈和队列的模拟实现 & 经典题目解析
学完链表,不去找几个经典例题巩固一下知识?链表的五大OJ经典例题,你会吗?不妨来看一看(知识剖析+图形理解)(下)
学完链表,不去找几个经典例题巩固一下知识?链表的五大OJ经典例题,你会吗?不妨来看一看(知识剖析+图形理解)(下)
111 0
学完链表,不去找几个经典例题巩固一下知识?链表的五大OJ经典例题,你会吗?不妨来看一看(知识剖析+图形理解)(下)
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
(蓝桥杯)递推与递归,前缀和,二分经典例题分析