全部问题 > 当前问题

汉诺塔讲的原理是懂,但是不明白这个代码是怎么一步步执行的,求解!

#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);

}


m 2015-11-25 22:32:56

共 9 个回答

嘿嘿大人 2015-11-26 00:06:34

程序错了:

#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 2015-11-29 09:45:15

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

m 2015-11-29 09:45:26

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

嘿嘿大人 2015-11-29 10:17:16

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

m 2015-11-29 11:22:40

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

嘿嘿大人 2015-11-29 11:48:45

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

m 2015-11-29 13:08:15

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

嘿嘿大人 2015-11-29 17:36:54
嘿嘿大人 2015-11-29 17:39:54

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

blob.png

问题来自: 汉诺塔