2.5 组织数据(2)

2014-03-11 13:03:04 · 作者: · 浏览: 110

2.5  组织数据(2)

这个递归解决方案遵循了前面递归解决方案的一些基本模式:

1. 通过解决其他塔问题来解决原始塔问题。

2. 其他塔问题比原始塔问题小;需要移动的圆盘少。准确地讲,每次递归调用使圆盘个数减1。

3. 当问题只有一个圆盘时(即基例),可直接得到解。

4. 这种使问题不断减小的方式确保最终到达基例。

注释:Hanoi塔问题的解决方案符合递归解决方案的4个标准

为解决塔问题,需要递归地解决很多圆盘数更少的问题。图2-17显示了在解决3个圆盘问题时的递归调用及其调用顺序。

注释:3个圆盘的解决方案

现在考虑此算法的C++实现。由于目前大多数计算机没有手臂,因此该函数通过下达指令来移动圆盘。这样,表示标杆的形参是char类型,相应实参为'A'、'B'和'C'。调用solveTowers(3, 'A', 'B','C')生成以下输出:
 

  1. Move top disk from pole A to pole B  
  2. Move top disk from pole A to pole C  
  3. Move top disk from pole B to pole C  
  4. Move top disk from pole A to pole B  
  5. Move top disk from pole C to pole A  
  6. Move top disk from pole C to pole B  
  7. Move top disk from pole A to pole B 

C++函数如下所示:
 

  1. void solveTowers(int count, char source, char destination, char spare)  
  2. {  
  3. if (count == 1)  
  4. {  
  5. cout    << "Move top disk from pole " << source 
  6. << " to pole " << destination << endl;  
  7. }  
  8. else  
  9. {  
  10. solveTowers(count - 1, source, spare, destination);     // X  
  11. solveTowers(1, source, destination, spare);                                 // Y  
  12. solveTowers(count - 1, spare, destination, source);     // Z  
  13. } // end if  
  14. }           // end solveTowers 

问题9 跟踪solveTowers函数的执行,解决两个圆盘的Hanoi塔问题。