Tower of Hanoi
本文最后更新于 2026年3月5日 晚上
Hanoi汉诺塔问题
引入
汉诺塔是我们已经再熟悉不过的东西了,其游戏的规则是有a,b,c三个杆子,同时在a上有n个盘子,我们需要通过移动将所有盘子都移动至c杆,但移动的过程中每次只能移动一个盘子,且大盘子不能在小盘子上。
解析
我们如果需要对这个题编写程序可以采用递归的思想,将这个大问题分解成一步一步的小问题,例如现在所有盘子都在a上,我们可以把最大的盘子上面的n-1个盘子先移动到b这个空盘上,然后将最大的盘子移动到c这个目标杆上,对于剩下的n-1个盘子亦是如此。每次我们先借用辅助盘将最大盘上面的所有盘子移动到辅助盘,然后将最大盘再移动到目标盘,以此分解问题,以此我们可以写出程序的主要函数,如下所示:
1 | |
对于上述程序我们来分析一下时间复杂度,其中move函数的时间复杂度可以记为常数,几乎不耗时,故该函数时间复杂度主要由两个递归函数hanoi决定,则
拓展
我们发现最终如果要实现汉诺塔这个盘子的移动最终需要
| 二进制数 | 移动 | 状态 |
|---|---|---|
| 000 | 初始状态 | ![]() |
| 001 | ![]() |
|
| 010 | ![]() |
|
| 011 | ![]() |
|
| 100 | ![]() |
|
| 101 | ![]() |
|
| 110 | ![]() |
|
| 111 | ![]() |
此用二进制表示汉诺塔移动方式给我们提供了新的思路,此发现实为巧妙,小编第一次了解时大受震撼。







