开启掘金成长之旅!这是我参与「掘金日新计划 · 12月更文挑战」的第6天
汉诺塔
汉诺塔是一种移动圆盘的游戏,同时也是一个简单易懂的递归算法应用示例
游戏规则
游戏开始时如左图所示,有3根柱子A、B、C,柱子A上有5个圆盘。把这5个圆盘按照原本的顺序移动到柱子C上之后游戏就会结束。
移动圆盘时需要遵守以下两个条件。
移动条件
1.1次只能移动1个圆盘。
2.不能把大的圆盘放在小的圆盘上。
我们的目标就是在这两个条件下,通过把圆盘往B或C移动来完成游戏。
图解
01
先来看看只有2个圆盘的情况吧
02
小的圆盘在最顶端,所以可以把它移动到B上
03
把大的圆盘移动到C上
04
再把小圆盘往C移动,操作完毕。由于只有2个圆盘,此时便可以确认游戏结束
05
3个圆盘时又会怎样呢?我们可以忽略最大的圆盘,先将其他的圆盘往B移动
06
将其他的2个圆盘按照之前移动只有2个圆盘时的操作移动到B
07
然后把最大的圆盘移动到C
08
再次按照之前的操作,把B上的2个圆盘移动到C。于是,3个圆盘的移动也完成了。实际上,不管需要移动多少圆盘,这个游戏最终都能达成目标。我们试着用数学归纳法来证明这个结论吧
09
只有1个圆盘时,可以轻松达成目标
10
假设圆盘数量为n时同样可以达成目标
11
思考一下圆盘数为n+1的情况
12
忽略最大的一个圆盘
13
根据之前的假设,圆盘数量为n时可以达成目标,所以先把n个圆盘移动到B
14
再把最大的圆盘移动到C
15
最后再把B上的n个圆盘移动到C,游戏结束
解说
像这样,在算法描述中调用算法自身的方法就叫作“递归”。递归被运用到各种各样的算法中,这些算法统称为“递归算法”。