标题:本人菜鸟,刚学C语言入门,请专家们帮忙解说以下程序的执行次序!
只看楼主
sdo21670sdm
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-5-9
结帖率:0
已结贴  问题点数:20 回复次数:5 
本人菜鸟,刚学C语言入门,请专家们帮忙解说以下程序的执行次序!
#include<stdio.h>
void hanoi(int n,char a,char b,char c);
long count;
int main()
{
    int h;
    printf("请输入汉诺塔圆盘的数量:");
    scanf("%d",&h);
    count=0;
    hanoi(h,'A','B','C');
   
    getch();
    return 0;
}
void hanoi(int n,char a,char b,char c)
{
    if(n==1)
    {        
       printf("第%d次,%c棒-->%c棒\n",++count,a,c);
    }
    else
    {
        hanoi(n-1,a,c,b);
        printf("第%d次,%c棒-->%c棒\n",++count,a,c);
        hanoi(n-1,b,a,c);
    }
}



我看不明白其中的  else
    {
        hanoi(n-1,a,c,b);
        printf("第%d次,%c棒-->%c棒\n",++count,a,c);
        hanoi(n-1,b,a,c);
    }是怎么执行的???我想知道他的执行次序!
搜索更多相关主题的帖子: C语言 入门 专家 
2010-05-09 20:31
itma
Rank: 4
等 级:业余侠客
帖 子:105
专家分:266
注 册:2010-2-8
得分:4 
{
        hanoi(n-1,a,c,b);//不断进入下一个循环
        printf("第%d次,%c棒-->%c棒\n",++count,a,c);
        hanoi(n-1,b,a,c);
    }
这个。。。
你去玩玩汉诺塔,然后总结出来他的通用解法就知道了。
就是不断进入下一个循环去找第一启发过程,这里的第一启发过程就是把A放到C,找到以后就倒着回来。。。
这个游戏没玩过的人杯具。。。
2010-05-09 21:21
baiyyddd
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:33
专家分:61
注 册:2010-5-10
得分:4 
应该是:
不断执行else里面的,直到n==1,再跳出吧!
2010-05-10 16:26
xueyuhanhai
Rank: 4
等 级:业余侠客
帖 子:90
专家分:238
注 册:2010-4-5
得分:4 
void hanoi(int n,char a,char b,char c)
{
    if(n==1)
    {        
       printf("第%d次,%c棒-->%c棒\n",++count,a,c);
    }
    else
    {
        hanoi(n-1,a,c,b);
        printf("第%d次,%c棒-->%c棒\n",++count,a,c);
        hanoi(n-1,b,a,c);
    }
}

楼主不要想的太复杂嘛,其实也有很简单的理解方法。
先把盘分为两部分,最上面的一个和下面的其他盘子。
例如两个盘:把A盘上面的一个移到B盘;P1
          再把A盘的下面的一个移到C盘;P2
          最后再把B盘的移到C盘上面。P3
多个盘也是这样的:
可以把函数
hanoi(int n,char a,char b,char c) 看为P1.即最上面的移到B移动后少一个盘子
hanoi(n-1,a,c,b);看为P2即下面的n-1个盘移到C
hanoi(n-1,b,a,c);看为是P3即把B盘中的一个移到C盘。
每次上面的移动都是基于下面的已经假设移动好了的。


2010-05-11 11:03
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:4 
首先执行的是主函数,然后调用那个汉诺依塔的函数,
然后这个函数不断的调用自己,直到n=1才开始回溯。
这是一个典型的递归问题。
楼主如果不明白的话。可以百度一下,汉诺依塔。

南国利剑
2010-05-12 02:15
liyang0430
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:98
专家分:159
注 册:2009-6-9
得分:4 
是这样的,其实就是一个摞盘的问题。有三个支架A,B,C。在A上有n个盘子。并且这些盘子从下到上是依次变小的。如果都是一样的话,就没有汉诺依塔这个游戏了!分为三步!
1  把A上的n-1个盘子借助C移到B上
2  再把A上最后一个盘子移到C上
3  把B上的n-1个盘子借助A移到C上
按照这个算法来设计程序!
当n=1时,也就是支架A上只有一个盘子,直接把这个盘子移到C支架上就可以了!
当n>1时,先把A支架上的上面摞的n-1个盘子借助C移到B上(为什么要借助C盘呢?因为盘子存在大小问题)。
也就是  hanoi(n-1,a,c,b);   
再把A支架上最后一个盘子也就是最大的那个盘子直接移到支架C上!
也就是    printf("第%d次,%c棒-->%c棒\n",++count,a,c);
最后再把支B上的n-1个盘子借助支架A移到支架C上
也就是   hanoi(n-1,b,a,c);
至于如何把n-1个盘子借助C移到B上以及如何把n-1 个盘子借助A移到C上,那是个烦琐的过程
用hanoi或者move 函数就可以实现了
#include"stdio.h"
#include"conio.h"
void main()
{ int n;
char A,B,C;
printf("input a number:\n");
scanf("%d\n",&n);
move(n-1,A,C,B);
move(n,A,C);
move(n-1,B,A,C);
getch();
}
4楼的就是这个意思!
2010-05-12 08:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-305983-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029569 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved