递归问题
汉诺塔(HANOI)
命题
有三根杆子,第一根有大小从小到大共 n n n个盘子,要求遵循以下3个规则,将在第一个杆子上全部的盘子移至第三个杆子。
- 每次只能移动一个盘子。
- 每次只能移动每个杆子最上面的盘子。
- 每根杆子上的盘子下面大,上面小。
求问题的最小步数。
例子:
当 n = 3 n=3 n=3时,移动方法如下图所示。
最小移动次数为 7 7 7,故 n = 3 n=3 n=3时命题的解为 7 7 7。
解决
方法:命名并求解
命名
- 设 H ( n ) H(n) H(n)为 n n n个盘子时汉诺塔问题的解.
- 三个杆子的编号分别为 A , B , C A,B,C A,B,C.
- 第 i i i层盘子为 h i h_i hi.
注: 书上或有的博文上用 H n H_n Hn,但笔者认为用 H ( n ) H(n) H(n)更为合适,因为问题的解更像函数.
求解
显然, H ( 1 ) = 1 H(1)=1 H(1)=1
观察可得,将 n n n个盘子从 A A A移动到 B B B相当于将 h 1 , h 2 ⋯ h n − 1 h_1,h_2\cdots h_{n-1} h1,h2⋯hn−1移动至 B B B后,将 h n h_n hn移至 C C C,再将 h 1 , h 2 ⋯ h n − 1 h_1,h_2\cdots h_{n-1} h1,h2⋯hn−1移至 C C C.
由定义知,将 h 1 , h 2 ⋯ h n − 1 h_1,h_2\cdots h_{n-1} h1,h2⋯hn−1从 A A A移至 B B B需 H ( n − 1 ) H(n-1) H(n−