递归算法核心思维
递归常让初学者感到困惑,关键在于转变视角。看待递归时,应明确函数的功能目标,而非纠结于调用栈的细节展开。例如归并排序中,我们只需相信 mergesort 能将无序数组变为有序,然后专注于如何利用这个功能将大问题拆解为小问题。只要保证递归有明确的结束条件,即可避免无限循环。

1. 汉诺塔
题目链接
面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)
题目描述

题目示例

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







