2.5 组织数据(2)
这个递归解决方案遵循了前面递归解决方案的一些基本模式:
1. 通过解决其他塔问题来解决原始塔问题。
2. 其他塔问题比原始塔问题小;需要移动的圆盘少。准确地讲,每次递归调用使圆盘个数减1。
3. 当问题只有一个圆盘时(即基例),可直接得到解。
4. 这种使问题不断减小的方式确保最终到达基例。
注释:Hanoi塔问题的解决方案符合递归解决方案的4个标准
为解决塔问题,需要递归地解决很多圆盘数更少的问题。图2-17显示了在解决3个圆盘问题时的递归调用及其调用顺序。
注释:3个圆盘的解决方案
现在考虑此算法的C++实现。由于目前大多数计算机没有手臂,因此该函数通过下达指令来移动圆盘。这样,表示标杆的形参是char类型,相应实参为'A'、'B'和'C'。调用solveTowers(3, 'A', 'B','C')生成以下输出:
- Move top disk from pole A to pole B
- Move top disk from pole A to pole C
- Move top disk from pole B to pole C
- Move top disk from pole A to pole B
- Move top disk from pole C to pole A
- Move top disk from pole C to pole B
- Move top disk from pole A to pole B

C++函数如下所示:
- void solveTowers(int count, char source, char destination, char spare)
- {
- if (count == 1)
- {
- cout << "Move top disk from pole " << source
- << " to pole " << destination << endl;
- }
- else
- {
- solveTowers(count - 1, source, spare, destination); // X
- solveTowers(1, source, destination, spare); // Y
- solveTowers(count - 1, spare, destination, source); // Z
- } // end if
- } // end solveTowers
问题9 跟踪solveTowers函数的执行,解决两个圆盘的Hanoi塔问题。