读书笔记---递归

  这段时间总是看到递归,认真研究后,我感受递归的思想十分独特,也十分常见。它是将某个问题分解成许多类似的问题,而后不断重复这个过程。而妙就妙在这个重复的过程当中能够有许多分叉,经典的例子即是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

相关文章
相关标签/搜索