读书笔记---递归

  这段时间老是看到递归,认真研究后,我感觉递归的思想十分独特,也十分常见。它是将某个问题分解成许多相似的问题,然后不断重复这个过程。而妙就妙在这个重复的过程中可以有许多分叉,经典的例子便是n阶Hanoi塔问题。

  

  Hanio塔问题:假设有三个分别命名为X,Y,Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,3,...,n 的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:

    (1) 每次只能移动一个圆盘;

    (2) 圆盘可以插在X,Y,和Z中的任一塔座上;

    (3) 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

  求搬动次数。

则其标准解法为(严蔚敏 数据结构 P55):

 1 void hanoi(int n,char x,char y,char z)
 2 //将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘按规则搬到
 3 //塔座z上,y可用作辅助塔座
 4 //搬动操作move(x,n,z)可定义为(c 是初值为0的全局变量,对搬动计数):
 5 //printf("%i.move disk %i from  %c  to  %c\n",++c,n,x,z); 
 6 {
 7     if(n==1)
 8         move(x,1,z);        //将编号为1的圆盘从x移到z
 9     else{
10         hanoi(n-1,x,z,y);    //将x上编号为1至n-1的圆盘移到y,z做辅助塔
11         move(x,n,z);        //将编号为n的圆盘从x移到z
12         hanoi(n-1,y,x,z);    //将y上编号为1至n-1的圆盘移到z,x做辅助塔 
13     } 
14 }

  这段代码中,在else语句中分叉成两部分,将y上的圆盘移到z。而后并不考虑具体操作。

  所以,对于递归的理解是:对于一个有多个重复操作的问题,考虑其最后一步或几步操作,而后将问题不断削减,直至最后一步或最后几步。而在这个过程中,可以有分叉。

 

posted @ 2017-04-15 13:45  岁月难言  阅读(236)  评论(0编辑  收藏  举报