zoukankan      html  css  js  c++  java
  • 汉诺塔---手写出栈压栈过程实现

    代码实现:
     1 #include<stdio.h>
     2 
     3 //函数的形参A、B、C不一定代表的是A、B、C柱子,递归传参的时候会变化!
     4 void hanoit(int n,char A,char B,char C){
     5     if(n==1){
     6         //如果剩下一个盘子,直接将A柱上的盘子从A移到C(直接从初始塔移动到目标塔)
     7         printf("将编号为%d的盘子从%c柱子移到%c柱子",n,A,C);
     8     }
     9     else{
    10       //否则,先将A柱上的n-1个盘子从A借助C移到B(从初始塔移动到介质塔)
    11       hanoit(n-1,A,C,B);//注意参数顺序:从A借助C移到B
    12       
    13       //A柱上最后一个盘子直接移到C柱上
    14       printf("将编号为%d的盘子从%c柱子移到%c柱子",n,A,C);
    15       
    16       //最后将B柱子的n-1个盘子从B借助A移到C(从介质塔移动到目标塔)
    17       hanoit(n-1,B,A,C);
    18     }
    19 }
    20 
    21 int main(){
    22     //三个柱子A、B、C,分别的作用是初始柱、介质柱、目标柱
    23     char ch1 = 'A';
    24     char ch2 = 'B';
    25     char ch3 = 'C';
    26     
    27     int n;
    28     
    29     printf("移动盘子的个数:");//也是最后一个盘子的编号,顶部第一个盘子的编号是1
    30     scanf("%d",&n);
    31     
    32     hanoit(n,'A','B','C');
    33     
    34     
    35     return 0;
    36 }
    View Code

     

    递归执行过程(调用方法的栈机制:不停的压栈、出栈(特点:先进后出)):

      假如输入的盘子个数为2

    主函数传参hanoit(2,’A‘,‘B','C'),压栈1

    n!=1,于是递归执行 hanoit(2-1,A,C,B),压栈2

    n==1,输出语句,压栈3,输出“将编号为1的盘子从A柱移到B柱",出栈3

    函数hanoit(2-1,A,C,B)出栈2

    执行下一条输出语句,压栈2,输出”将编号为2的盘子从A柱移到C柱“,出栈2

    执行递归 hanoit(2-1,B,A,C),压栈2,输出”将编号为1的盘子从B柱移到C柱“,出栈2

    函数hanoit(2,’A‘,‘B','C')出栈1

    程序执行完毕

    假如输入的盘子个数为3:(较为麻烦,需要不断交替参数)

    主函数传参hanoit(n=3,A=’A‘,B=‘B',C='C')压栈1。此时A=A、B=B、C=C

     

    n==3,递归执行hanoit(3-1,A,C,B),压栈2。此时A=A==A、B=C==C、C=B==B

     

    n==2,递归执行hanoit(2-1,A,C,B),压栈3。此时A=A==A、B=C==B、C=B==C

     

    n==1,输出语句,压栈4,输出“将编号为1的盘子从A柱移到C柱",出栈4

     

    函数hanoit(2-1,A,C,B)执行完毕,出栈3

     

    执行下一条输出语句,压栈3,输出”将编号为2的盘子从A柱移到B柱“,出栈3

     

    执行函数hanoit(2-1,B,A,C),压栈3,此时A=B==C、B=A==A、C=C==B

     

    n==1,输出语句,压栈4,输出“将编号为1的盘子从C柱移到B柱",出栈4

     

    函数hanoit(2-1,B,A,C)执行完毕,出栈3

     

    函数hanoit(3-1,A,C,B)执行完毕,出栈2

     

    执行下一条输出语句,压栈2,输出“将编号为3的盘子从A柱移到C柱",出栈2

     

    注意此时n==3时的各个参数顺序,往下继续执行hanoit(3-1,B,A,C)压栈2,此时A=B==B、B=A==A、C=C==C

     

    n==2,递归执行hanoit(2-1,A,C,B),压栈3。此时A=A==B、B=C==C、C=B==A

     

    n==1,输出语句,压栈4,输出“将编号为1的盘子从B柱移到A柱",出栈4

     

    函数hanoit(2-1,A,C,B)执行完毕,出栈3

     

    执行下一条输出语句,压栈3,输出”将编号为2的盘子从B柱移到C柱“,出栈3

     

    往下执行hanoit(2-1,B,A,C),压栈3此时A=B==A、B=A==B、C=C==C

     

    n==1,输出语句,压栈4,输出“将编号为1的盘子从A柱移到C柱",出栈4

     

    函数hanoit(2-1,B,A,C)执行完毕,出栈3

     

    函数hanoit(3-1,B,A,C)执行完毕,出栈2

     

    函数hanoit(n=3,A=’A‘,B=‘B',C='C')执行完毕,出栈1

     

    程序执行完毕

  • 相关阅读:
    C++ Toolkit zz
    开发人员实际在用哪些工具 zz
    Page.RegisterClientScriptBlock和Page.RegisterStartupScript有何区别?
    动态网址与静态网址
    DIV垂直居中 (转)
    JS网页打印设置技巧(
    谈*静态页*(或网页*静态化*)的时候,请区分一些概念(转)
    添加新增 删除旧的 避免id自增过多
    浅谈CSRF攻击方式(转)
    简单的角色权限管理
  • 原文地址:https://www.cnblogs.com/sunbr/p/11363687.html
Copyright © 2011-2022 走看看