野良神yls 发表于 2017-7-31 15:05:49

汉诺塔问题

#include<stdio.h>

void main()
{
    void hanoi(int n,char a,char b,char c);
    int n;
    printf("请输入要移动的块数:");
    scanf("%d",&n);
    hanoi(n,'a','b','c');
}

void hanoi(int n,char a,char b,char c)
{
    if(n==1)
      printf("\t%c->%c\n",a,c);   
    else
    {
      hanoi(n-1,a,c,b);            
      printf("\t%c->%c\n",a,c);
      hanoi(n-1,b,a,c);         
    }
}


这个程序是没问题的,实际的移动问题我是清楚的,但是这种递归程序的内部是怎么运行的我不太清楚,进行调试了也看不懂..因为也是一下子输出一堆...
比如说我以3为例子,输出中有一个c->b
比如说这个语句是怎么输出的啊...代码中哪个语句输出了这个内容啊...,可以的话以3为例子..一个输出一个输出的说一下呗..不行的话,大概说一下也行,我再看看..谢谢了~

野良神yls 发表于 2017-7-31 16:29:53

石沉大海...

冬雪雪冬 发表于 2017-7-31 16:49:21

递归不是把问题复杂化,而是使编程更符合人类的思维方式。
我们把三根柱子分别作为“起点”、“临时”和“目标”。目的是把n个圆盘从“起点”移到“目标”。
1,首先,把上面n-1个移到“临时”上,至于怎么移,等会儿再说。
2,然后把第n个移到“目标”上,这步是实打实的移动,所以用printf
3,最后再把上面n-1个移到“目标”上。完成全过程。
1和3怎么移动,这里就用到了递归,只是“起点”、“临时”和“目标”变化了。

ba21 发表于 2017-7-31 18:54:44

想了解内部是怎么运行   提升知识,学一下汇编

野良神yls 发表于 2017-7-31 19:38:25

冬雪雪冬 发表于 2017-7-31 16:49
递归不是把问题复杂化,而是使编程更符合人类的思维方式。
我们把三根柱子分别作为“起点”、“临时”和“ ...

还是不懂..就像我说的..第三个输出为什么会是c->b啊

野良神yls 发表于 2017-7-31 19:38:59

ba21 发表于 2017-7-31 18:54
想了解内部是怎么运行   提升知识,学一下汇编

好吧..我先把c的基础学完再说吧..

冬雪雪冬 发表于 2017-7-31 21:56:30

野良神yls 发表于 2017-7-31 19:38
还是不懂..就像我说的..第三个输出为什么会是c->b啊

还是做个图吧,你看看移动的次序。

野良神yls 发表于 2017-7-31 23:46:19

冬雪雪冬 发表于 2017-7-31 21:56
还是做个图吧,你看看移动的次序。

明白了,我对hanoi函数中abc的理解有误,我还以为比如 hanoi(2,a,c,b)执行后是hanoi(1,a,c,b)..原来后一个函数对应的是前一个函数中的abc.
谢谢大佬了~
哈哈{:5_106:}
页: [1]
查看完整版本: 汉诺塔问题