算法初接触 | 其他算法[汉诺塔]

196 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12月更文挑战」的第6天

汉诺塔

汉诺塔是一种移动圆盘的游戏,同时也是一个简单易懂的递归算法应用示例

游戏规则

1.jpg
游戏开始时如左图所示,有3根柱子A、B、C,柱子A上有5个圆盘。把这5个圆盘按照原本的顺序移动到柱子C上之后游戏就会结束。
移动圆盘时需要遵守以下两个条件。
移动条件
1.1次只能移动1个圆盘。
2.不能把大的圆盘放在小的圆盘上。
我们的目标就是在这两个条件下,通过把圆盘往B或C移动来完成游戏。

图解

01

2.jpg
先来看看只有2个圆盘的情况吧

02

3.jpg
小的圆盘在最顶端,所以可以把它移动到B上

03

4.jpg
把大的圆盘移动到C上

04

5.jpg
再把小圆盘往C移动,操作完毕。由于只有2个圆盘,此时便可以确认游戏结束

05

6.jpg
3个圆盘时又会怎样呢?我们可以忽略最大的圆盘,先将其他的圆盘往B移动

06

7.jpg
将其他的2个圆盘按照之前移动只有2个圆盘时的操作移动到B

07

8.jpg
然后把最大的圆盘移动到C

08

9.jpg
再次按照之前的操作,把B上的2个圆盘移动到C。于是,3个圆盘的移动也完成了。实际上,不管需要移动多少圆盘,这个游戏最终都能达成目标。我们试着用数学归纳法来证明这个结论吧

09

10.jpg
只有1个圆盘时,可以轻松达成目标

10

11.jpg
假设圆盘数量为n时同样可以达成目标

11

12.jpg
思考一下圆盘数为n+1的情况

12

13.jpg
忽略最大的一个圆盘

13

14.jpg
根据之前的假设,圆盘数量为n时可以达成目标,所以先把n个圆盘移动到B

14

15.jpg
再把最大的圆盘移动到C

15

16.jpg
最后再把B上的n个圆盘移动到C,游戏结束

解说
像这样,在算法描述中调用算法自身的方法就叫作“递归”。递归被运用到各种各样的算法中,这些算法统称为“递归算法”。