郝斌吧 关注:5,017贴子:7,116
  • 20回复贴,共1

C语言算汉诺塔,递归时的输出是怎么一步一步来的?如图,求大神

只看楼主收藏回复

C语言算汉诺塔,递归时的输出是怎么一步一步来的?如图,求大神帮忙


IP属地:四川来自Android客户端1楼2019-02-14 20:01回复
    这里的详细步骤有点乱 希望大神能指点一番 看了一下午了


    IP属地:四川来自Android客户端2楼2019-02-14 20:02
    回复
      本程序有两个需要注意的地方:
      1.函数中有两个递归,需要压栈的次数较多,第一个递归函数每次递归时后面的语句全要压栈,不管是主调函数发起的调用或者是第二个递归函数发起的调用
      2.在函数递归的时候形参和实参要按形参和实参所对应的位置传递,不要按形参和实参名字传递,每递归一次参数都会有变化
      3.流程图:
      假如我们需要移动三个盘子
      1)首先由主函数main发起调用和传递参数,本次调用所有的参数都以主函数所传顺序为准。
      Main 调用 HanoiTower(3, ‘A’, ‘B’, ‘C’);
      HanoiTower
      {
      HanoiTower(2, ‘A’, ‘C’, ‘B’);//函数的参数变为A,C,B 由参数换位(a, c, b)所得
      压栈 --> printf(3, A-->C);//本次压栈是主函数发起,所以参数按主函数所传顺序
      压栈 --> HanoiTower(2, ‘B’, ‘A’, ‘C’);
      }
      2)由HanoiTower内部的第一个递归函数发起调用,参数以其所传顺序为准
      HanoiTower 调用 HanoiTower(2, ‘A’, ‘C’, ‘B’)第一次递归
      {
      HanoiTower(1, ‘A’, ‘B’, ‘C’);//由参数(a, c, b)所得
      压栈 --> printf(2, A->B);//由第一次递归所传参数顺序决定
      压栈 --> HanoiTower(1, ‘C’, ‘A’, ‘B’);
      }
      3)由HanoiTower 内部的第一个递归函数发起调用,参数以其所传顺序为准
      HanoiTower 调用 HanoiTower (1, ‘A’, ‘B’, ‘C’) 第二次递归
      {
      If (1==n) //条件成立
      输出 <-- printf(1, A->C); //第一个递归函数完毕,开始出栈
      }
      按先进后出,后进先出的顺序:
      2) 出栈 <-- printf(2, A->B);
      出栈 <-- HanoiTower(1, ‘C’, ‘A’, ‘B’);
      If (1==n) //条件成立
      输出 <--printf(1, C->B);
      1)出栈 <-- printf(3, A-->C);
      出栈 <-- HanoiTower(2, ‘B’, ‘A’, ‘C’);//第二个递归函数开始递归
      HanoiTower(1, ‘B’, ‘C’, ‘A’);//调用第一个递归函数
      压栈 --> printf(2, “B->C”);
      压栈 --> HanoiTower(1, ‘A’, ‘B’, ‘C’);//由(b, a ,c)得来
      If (1==n)//条件成立
      输出 <--printf(1, B->A); //第二个递归函数完毕,开始出栈
      出栈printf输出 <--printf(2, “B->C”);
      出栈 <-- HanoiTower(1, ‘A’, ‘B’, ‘C’);
      If (1==n)//条件成立
      输出 <-- printf(1, A->C);
      程序结束,将printf输出按顺序整理如下:
      移动三个盘子的步骤:
      printf(1, A->C);
      printf(2, A->B);
      printf(1, C->B);
      printf(3, A->C);
      printf(1, B->A);
      printf(2, B->C);
      printf(1, A->C);
      */


      3楼2019-02-18 21:04
      收起回复
        我当时也想了好几个小时,其实就是传参的时候注意参数的变化,还有就是压栈,函数调用自己时,函数下面的语句全部都要进行压栈,压栈是的参数值要以发起调用的函数所传的值为准。


        4楼2019-02-18 21:09
        收起回复
          2)由HanoiTower内部的第一个递归函数发起调用,参数以其所传顺序为准
          HanoiTower 调用 HanoiTower(2, ‘A’, ‘C’, ‘B’)第一次递归
          {
          HanoiTower(1, ‘A’, ‘B’, ‘C’);//由参数(a, c, b)所得
          压栈 --> printf(2, A->B);//由第一次递归所传参数顺序决定
          压栈 --> HanoiTower(1, ‘C’, ‘A’, ‘B’);
          }
          请问: “HanoiTower(1, ‘A’, ‘B’, ‘C’);//由参数(a, c, b)所得” 中既然由参数(a, c, b)所得,为什么不是HanoiTower(1, ‘A’, ‘C’, ‘B’)呢


          IP属地:湖南5楼2019-04-16 16:27
          收起回复


            IP属地:湖南6楼2019-04-16 16:43
            回复
              我看了这个视频了,然后有写一下怎么理解的,如果你现在还不理解的话,我可以发我的理解给你


              IP属地:广东来自Android客户端7楼2019-09-01 23:37
              收起回复