递归与搜索算法实战:汉诺塔、链表操作及快速幂
1 汉诺塔问题
题目描述

汉诺塔问题(递归解法)
1. 问题描述
汉诺塔问题是一个经典的递归问题,规则如下:
- 有三根柱子,记为 A(起始柱)、B(辅助柱)、C(目标柱)。
- A 柱上有 n 个盘子,从小到大叠放(从上到下编号为 1 到 n)。
- 目标是将所有盘子从 A 移到 C,每次只能移动一个盘子,并且大盘子不能放在小盘子上面。
2. 递归思想
基本情况(递归终止条件)
- 当
n = 1时,直接将 A 最上面的盘子移到 C。
递归分解(n ≥ 2)
若要将 A 上的 n 个盘子移到 C,可以分解为三个步骤:
- 将 A 上除了最底下的盘子(即上面 n-1 个盘子)移到 B(借助 C 作为辅助柱)。
- 将 A 最底下的最大盘子移到 C。
- 将 B 上的 n-1 个盘子移到 C(借助 A 作为辅助柱)。
这样,规模为 n 的问题被拆分为两个规模为 n-1 的子问题。
3. 递归算法流程(函数设计)
函数头
void hanota(vector<int>& a, vector<int>& b, vector<int>& c, int n);
- 返回值:无
- 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)
- 函数作用:将 A 中的上面 n 个盘子挪到 C 中
递归函数流程
- 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回;
- 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
- 将 A 中最上面的一个盘子挪到 C 中;
- 将 B 中上面 n-1 个盘子挪到 C 中。
解题过程














