C++ 递归算法实战:汉诺塔问题解析
题目描述

题目示例

算法原理(递归)
思路
这是一道递归方法的经典题目,我们可以先从最简单的情况考虑:
- 假设 n=1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上;
- 如果 n=2 呢?这时候我们就要借助 B 了,因为先盘子必须时刻都在大盘子上面,共需要 3 步 (为了方便叙述,记 A 中的盘子从上到下为 1 号,2 号)
- 1 号盘子放到 B 上
- 2 号盘子放到 C 上
- 3 号盘子放到 C 上 至此,C 中的盘子从上到下为 1 号,2 号。
- 如果 n>2 呢?这时我们需要用到 n=2 时的策略,将 A 上面的两个盘子挪到 B 上,再将最大的盘子挪到 C 上,最后将 B 上的小盘子挪到 C 上就完成了所有步骤。假如 n=3 时如下图:

因为 A 中最后处理的是最大的盘子,所以在移动过程中不存在大盘子在小盘子上的情况。 则本题可以解释为:
- 对于规模为 n 的问题,我们需要将 A 柱上的 n 个盘子移动到 C 柱上。
- 规模为 n 的问题可以被拆分为规模为 n-1 的子问题:
- a.将 A 柱上的上面 n-1 个盘子移动到 B 柱上。
- b.将 A 柱上的最大盘子移动到 C 柱上,然后将 B 柱上的 n-1 个盘子移动到 C 柱上。
- 当问题的规模变为 n=1 时,即只有⼀个盘子时,我们可以直接将其从 A 柱移动到 C 柱
- 需要注意的是,步骤 2.b 考虑的是总体问题中的 子问题 b 情况。在处理子问题的子问题 b 时,我们应该将 A 柱中的最上面的盘子移动到 C 柱,然后再将 B 柱上的盘子移动到 C 柱。在处理总体问题的子问题 b 时,A 柱中的最大盘子仍然是最上面的盘子,因此这种做法是通用的
算法流程
递归函数设计:void hanotaa(vector& A, vector& B, vector& C, int n)
- 返回值:无;
- 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)。
- 函数作用:将 A 中的上面 n 个盘子挪到 C 中
递归函数流程:
- 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回
- 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
- 将 A 中最上面的⼀个盘子挪到 C 中;
- 将 B 中上面 n-1 个盘子挪到 C 中




