汉诺塔程序精髓解析

亚星管理平台 162 4

  这是xg111net一个汉诺塔程序,在各数据结构和算法设计的书中都有涉及,是递归的必修课

  #include

      void main()

       void hanoi(int n,char one,char two,char three);//函数声明

       int m;

       printf("input the nuber of deskes:");

       scanf("%d",&m);

       printf("The step to moving %d deskes:n",m);

       hanoi(m,’A’,’B’,’C’);//函数调用

      void hanoi(int n,char one,char two,char three)

       void move(char x,char y);//函数声明

       if(n==1)move(one,three);//条件成立,调用“void move(char x,char y)”函数

       else

       hanoi(n-1,one,three,two);//调用函数本身

       move(one,three);//调用“void move(char x,char y)”函数

       hanoi(n-1,two,one,three);//调用函数本身

      void move(char x,char y)

       printf("%c--->%cn",x,y);

    “hanoi(n-1,one,three,two);//调用函数本身

    move(one,three);//调用“void move(char x,char y)”函数

    hanoi(n-1,two,one,three);//调用函数本身”

    这段代码是精髓,你太平洋xg111可以以n=3来进行分析:

    开始3个都在A(one)上面,目标是吧这三个移动到C上;

    hanoi(n-1,one,three,two)是以C(three)为媒介,将3-1=2个移动到B(two)上,为什么要以C为媒介进行移动呢,因为汉诺塔的规则规定,每次只能移动一个,而且大的一定要在小的下边。

    完成这一步之后,的情况是A(one)上还剩下一个最大的,C(three)上什么都没有,B(two)上有一个最小的和一个中等的。

    然后用move(one,three)把A上剩下的最大的移动到目标C(three)上。

    然后在调用hanoi(n-1,two,one,three)把B(two)上的两个以A(one)为中转移动到C上。则所有步骤完成。

    最好实际玩两把就能更深刻的理解了xg111net企业邮局

标签: 汉诺 精髓 解析 程序

抱歉,评论功能暂时关闭!