递归专题(1)——汉诺塔

🔥近津薪荼:个人主页

🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》

人不可以逃避困难,亦不可以放弃希望。

------《病隙碎笔》


1.本期知识点导图

2.上期参考代码:

本期,我们开始学习递归专题,为bfs专题做铺垫

3.本期要讲解的题目是:

汉诺塔问题

要点:

  • 一次动一个
  • 小的在上大的在下
  • 先进后出(栈)

4.解题

我们拿到一个新题,不会一下子就能想到使用递归的方法来解决,得有一个分析的过程,这个过程是最重要的,知道该使用递归解题之后,代码的书写反而非常简单。

不知道大家小时候有没有玩过汉诺塔玩具,像这种:

我们现在就来模拟一下玩玩具的过程,来寻找解题的方法。正常小朋友玩的都是5层以上的,3层对他们来说可能有点幼稚但是对大学生来说刚刚好,我们就模拟一下1到3层的叭。

4.1模拟:

通过模拟我们可以总结出汉诺塔移动的三步走规律:

  • 第一步:把a柱的前n-1个盘子,借助于c柱,放到b柱上
  • 第二步:把a柱剩下来的一个盘子放到c柱上**(无需借助)**
  • 第三步:把b柱的n-1个盘子借助于a,放到c柱上

其中第二步很好理解,n=1的时候,只需要第二步即可,无需借空柱(最底层的操作)

最后我们将会发现,只有无需借助空柱的,才是真干活的

第一第三步我们来看n=2和n=3

  • n=2的时候
  1. 先把第1个盘子放到b上
  2. 然后把a的最后一个盘子放到c
  3. 再把b放到c

这里就需要借助b才能完成任务了

  • 我们再来看n=3
  1. 我们要想办法把a柱上的n-1,也就是上边两个盘子放到b上
  2. 然后把a最后一个盘子放c上
  3. 最后再想办法把b上的两个盘子放c上

第一步和第三步都需要借助第三个闲着的柱子

4.2那我们总结一下,我们要解决的问题是:

借助b柱,将a柱的n个盘子转移到c柱上

具体怎么做:

  • 第一步:把a柱的前n-1个盘子,借助于c柱,放到b柱上
  • 第二步:把a柱剩下来的一个盘子放到c柱上
  • 第三步:把b柱的n-1个盘子借助于a,放到c柱上

聚焦于第一步(子问题),我们又需要

第一步:借助b柱,把n-2个盘子放到c上......

一直向前递推,直到n=1,无需借助空柱。

4.3至此,递归的逻辑就跃然纸上了:

将移动n个盘子,转化成移动n-1个盘子的子问题,一直往前递推,直至n=1时开始递归

5代码逻辑:

要写好一个递归的代码,最重要的是:

**1.找到重复子问题,写函数头:**借助空柱,挪动盘子

**2.关心子问题具体需要做什么,写函数体:**上边讲的三步走

**3.找到递归的出口,不能死循环:**递推到n=1开始递归

递归,把上边三个基本问题解决好,就没问题了,把一个个子问题当成" 黑盒 ",就像函数中的对应法则f一样,虽然这么说有点神秘,但是你要相信照这样写出来的递归能帮你解决问题,具体怎么解决的,别管,为什么答案是对的,因为我们的逻辑是对滴!

要是实在想知道细节,可以自己画个递归图看看。(但是不要死磕,记住,递归一定是在宏观的角度去学的)

画递推图还是挺麻烦的,由于这是递归的第一道题,我给大家简单画了一个3层汉诺塔,以后不会再画咯

递归的过程图

黑线是递推过程,蓝线是递归过程

下期要讲解的题目是:

合并两个有序链表

下期见:

相关推荐
菜鸡儿齐4 小时前
leetcode-电话号码的字母组合
算法·leetcode·职场和发展
xhyu614 小时前
【学习笔记】推荐系统 (4.召回:Deep Retrieval、其他召回通道、曝光过滤)
笔记·学习
We་ct4 小时前
LeetCode 236. 二叉树的最近公共祖先:两种解法详解(递归+迭代)
前端·数据结构·算法·leetcode·typescript
小白菜又菜4 小时前
Leetcode 229. Majority Element II
算法·leetcode·职场和发展
Frostnova丶4 小时前
LeetCode 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串
算法·leetcode·哈希算法
消失的旧时光-19434 小时前
C++ 多线程与并发系统取向(七)—— 并发排障与工程纪律(从“会写”到“能控场”)
开发语言·c++·并发
历程里程碑5 小时前
普通数组---合并区间
java·大数据·数据结构·算法·leetcode·elasticsearch·搜索引擎
小帅学编程5 小时前
Python学习
开发语言·python·学习
Felven5 小时前
B. 250 Thousand Tons of TNT
算法
小老鼠不吃猫5 小时前
深入浅出(十三)QWT库——高稳定二维绘图
c++·qt·二维图