这段时间总是看到递归,认真研究后,我感受递归的思想十分独特,也十分常见。它是将某个问题分解成许多类似的问题,而后不断重复这个过程。而妙就妙在这个重复的过程当中能够有许多分叉,经典的例子即是n阶Hanoi塔问题。数据结构
Hanio塔问题:假设有三个分别命名为X,Y,Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,3,...,n 的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按一样顺序叠排,圆盘移动时必须遵循下列规则:spa
(1) 每次只能移动一个圆盘;code
(2) 圆盘能够插在X,Y,和Z中的任一塔座上;blog
(3) 任什么时候刻都不能将一个较大的圆盘压在较小的圆盘之上。递归
求搬动次数。io
则其标准解法为(严蔚敏 数据结构 P55):class
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。然后并不考虑具体操做。变量
因此,对于递归的理解是:对于一个有多个重复操做的问题,考虑其最后一步或几步操做,然后将问题不断削减,直至最后一步或最后几步。而在这个过程当中,能够有分叉。nio