递归算法入门:汉诺塔与合并有序链表实战解析
递归往往是初学者最头疼的环节,但掌握其核心逻辑后,许多复杂问题会迎刃而解。理解递归的关键在于建立'宏观视角':不要下意识去追踪函数内部的每一层展开,而是先明确这个函数的功能是什么。只要相信函数能完成它被定义的任务,剩下的就是组合这些任务。
递归核心思路
看待递归最重要的点,是清楚要递归的函数功能到底是什么。递归的本质是自己调用自己,就像我们调用其他函数是为了利用其功能一样。以归并排序为例,mergesort 的功能是将无序数组变成有序。当我们调用 mergesort 处理左半部分时,我们不需要关心它具体怎么排序,只需相信调用后左边数组已有序。同理处理右边。最后合并两部分即可。这种'信任函数'的态度能让我们避免陷入递归深度的细节泥潭,只关注边界条件和整体逻辑。

1. 汉诺塔
题目描述
有三根柱子 A、B、C,A 柱上有 n 个大小不同的盘子,从小到大叠放。要求将 A 柱上的所有盘子移动到 C 柱,移动过程中大盘子不能压在小盘子上面,且每次只能移动一个盘子。

算法思路
这是一个经典的递归场景。假设 n=1,直接从 A 移到 C。如果 n>1,我们可以将其拆解为三个步骤:
- 将 A 柱上面的 n-1 个盘子借助 C 柱移动到 B 柱。
- 将 A 柱剩下的最大盘子直接移动到 C 柱。
- 将 B 柱上的 n-1 个盘子借助 A 柱移动到 C 柱。
当规模缩减到 n=1 时,即为递归结束条件。

C++ 代码实现
{
:
{
(A, B, C, A.());
}
{
(n == ) {
z.(x.());
x.();
;
}
(x, z, y, n - );
z.(x.());
x.();
(y, x, z, n - );
}
};






