读书笔记---递归
这段时间老是看到递归,认真研究后,我感觉递归的思想十分独特,也十分常见。它是将某个问题分解成许多相似的问题,然后不断重复这个过程。而妙就妙在这个重复的过程中可以有许多分叉,经典的例子便是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。而后并不考虑具体操作。
所以,对于递归的理解是:对于一个有多个重复操作的问题,考虑其最后一步或几步操作,而后将问题不断削减,直至最后一步或最后几步。而在这个过程中,可以有分叉。