介绍
如下图所示,从左到右有 A、B、C 三根柱子,其中 A 柱子上面有从小叠到大的 n 个圆盘,现要求将 A 柱子上的圆盘移到 C 柱子上去,期间只有一个原则:一次只能移到一个盘子,且大盘子不能在小盘子上面,求移动的步骤和移动的次数。
思路
- 当
n == 1
:- 1 号盘:A -> C
- 当
n == 2
:- 1 号盘:A -> B
- 2 号盘:A -> C
- 3 号盘:B -> C
- 当
n == 3
:- 1 号盘:A -> C
- 2 号盘:A -> B
- 1 号盘:C -> B
- 3 号盘:A -> C
- 1 号盘:B -> A
- 2 号盘:B -> C
- 1 号盘:A -> C
分析:实现这个算法可以简单分为三个步骤:
- 把
n-1
个盘子由 A 移到 B; - 把第
n
个盘子由 A 移到 C; - 把
n-1
个盘子由 B 移到 C;
代码
|
|
时间复杂度
利用数学上的数列知识:F(n=1) = 1
, F(n=2) = 3
,F(n=3) = 7
,F(n) = 2F(n-1)+1
,所以 F(n) = 2n - 1,为指数级别的时间复杂度。
参考: 汉诺塔的图解递归算法