汉诺塔讲的原理是懂,但是不明白这个代码是怎么一步步执行的,求解!
m 圈内达人 2015-11-25 22:32:56
1289 9 0

#include <stdio.h>

viod move(int n,int a,int b,int c)

{

  if(n>0)

  {

    move(n-1,a,c,b)

    printf("%d->%d\n",a,c);

  }

}

main()

{

  int n=3;

  move(n,1,2,3);

}


问题来自: 汉诺塔

共 9 个回答

    嘿嘿大人 一代宗师 1397天前

    程序错了:

    #include <stdio.h>


    void move(int n,int a,int b,int c)


    {


      if(n>0)


      {


        move(n-1,a,c,b);

    printf("%d->%d\n",a,c);

        move(n-1,b,a,c);


      }


    }


    main()


    {


      int n=3;


      move(n,1,2,3);


    }

    这道题考的就是递归函数的调用,如果你要执着于一步一步的去做很麻烦,起码也有十几个调用,我写了两页都没写完,太麻烦了,所以不需要去知道它是怎么去执行的,你只需要知道为啥这么写就可以了,这还只是3个,如果多点,这样一步一步去做一天都做不完,所以只要只要这么写就可以了,而且这个也只可能考点选择题,不必这么较真,建议你去搞懂为啥这么写;

    void move(int n,int a,int b,int c)//a代表原始塔,b代表过程塔,c代表目标塔,n是需要移动的盘子


    {


      if(n>0)//判断要移动的盘子大于0不,如果不大于0就不执行下面的语句;


      {


        move(n-1,a,c,b);//将盘子的个数减一,然后将目标塔和过程塔互换

    printf("%d->%d\n",a,c);//这个就是n个盘子里面最大的那个盘子从原始塔移动到目标塔去

        move(n-1,b,a,c);//这个就是将原始塔和过程塔互换


      }

    反正有个通用公式,就是先将n-1个盘子移动到过程塔上,然后将原始塔上最大的盘子移动到目标塔,然后再将过程塔上的n-1个盘子移动到目标塔;

    有些东西没必要去每一步都去写出来,就像for语句一样,那么多次执行也没见得有人一步一步去写出来嘛,只要搞懂它的原理就可以了,记住就行了;


    m 圈内达人 1394天前

    move是什么,自己定义的吗?

    m 圈内达人 1394天前

    回复 嘿嘿大人move是什么,自己定义的吗?

    嘿嘿大人 一代宗师 1394天前

    回复 m:对啊,自定义函数肯定是自己定义的啊

    m 圈内达人 1394天前

    回复 嘿嘿大人:这里的a,b,c是怎么赋值的?

    嘿嘿大人 一代宗师 1394天前

    回复 mblob.png主函数调用的时候有实参,就是将实参赋值给形参的

    m 圈内达人 1394天前

    回复 嘿嘿大人:还是不懂运行的原理,可以写出n=2时的运行过程吗?

    嘿嘿大人 一代宗师 1394天前

    回复 m:真的不用去纠结步骤的,很麻烦的,我给你写了下,你看 能明白不嘛::

    blob.png

您还没有登录,所以不能回复该问题
我要回复

  • 0

    点赞

  • 扫一扫分享朋友圈

    二维码

  • 分享

相关问题