| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1069 人关注过本帖
标题:关于Hanoi塔的问题
只看楼主 加入收藏
fedcab123
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:100
注 册:2011-9-3
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
关于Hanoi塔的问题
程序代码:
move(int n,int x,int y,int z)
{
    if(n==1)
      printf("%c-->%c\n",x,z);
    else
    {
      move(n-1,x,z,y);//1   这2句是怎么使输出的字符变换的啊?   一定要按照他的这个格式才能变换 是么??
      printf("%c-->%c\n",x,z);
      move(n-1,y,x,z);//2
    }
}
main()
{
    int h;
    printf("\ninput number:\n");
    scanf("%d",&h);
    printf("the step to moving %2d diskes:\n",h);
    move(h,'a','b','c');
}
else 后面的那2句很让我崩溃啊……
2011-09-28 16:07
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:15 
你得理解move函数的参数是什么含义。
借助Y,将Z移到X上。

倚天照海花无数,流水高山心自知。
2011-09-28 16:12
fedcab123
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:100
注 册:2011-9-3
收藏
得分:0 
还是不太明白啊……
主要是看到同时有3个参数我就有点发晕
move(n-1,x,z,y)的意思是把  N-1借助 Y将Z移到X上是么?
我主要就是没明白这句话里n-1后面的 x y z 都是什么作用

比如别的定义里 int a,b,c;这类的语句 要是改成int a,b,c,d,...;这都能知道是什么意思,
可是要把move(n-1,x,z,y) 改成 move(n-1,x,z,y,a,b)这样的,我完全不能理解
2011-09-28 17:16
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
n x y z 是形参
h 'a' 'b' 'c'是实参
你对应看一下。
对递归来说,你最好画个图来表示这个递归过程就清楚了。

倚天照海花无数,流水高山心自知。
2011-09-28 18:21
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:5 
递归的艺术类似于分形

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-09-28 21:59
云杨
Rank: 1
等 级:新手上路
帖 子:20
专家分:4
注 册:2011-10-25
收藏
得分:0 
呵呵!
2011-11-01 22:41
云杨
Rank: 1
等 级:新手上路
帖 子:20
专家分:4
注 册:2011-10-25
收藏
得分:0 
主要是一种对应关系 性参合实参的 我也在研究哦
2011-11-01 22:44
cosam
Rank: 4
等 级:业余侠客
帖 子:146
专家分:259
注 册:2011-8-25
收藏
得分:0 

其实就是一直在出栈入栈
1:首先明确程序的流程从整体来看是:"由上到下顺序" 执行的。
2: 举个简单的例子试一下流程:比如2个盘子,然后再去搞些多的;
3: 递归一直都在栈里玩,递归其实最好少用,不单是效率慢,而且很耗费空间。
    "比如你输入60个盘子,你基本是要重启电脑了"
   只是对于某些问题作用很大,比如树的编历;
///
下面是流程,当然最好以画出流程图。
//======================
   A1:  首先:输入n==2;
        执行else{}
        第一次进入到 hanrota(n-1,A,C,B);==> hanrota(1,A,C,B);
  A2:
        这时 n==1;
       /// 执行//printf("将编号为%d的盘子从%c柱子移到%c柱子\n",n,A,C);
        然后执行: reutrn;
        pop栈:
        这一层执行完毕
   A3:
        回到n==2(上一层);
        继续执行下一行
        ///printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
        执行:hanrota(n-1,B,A,C)=>hanrota(1,B,A,C);
    A4:
        这时 n==1;
        ///执行//printf("将编号为%d的盘子从%c柱子移到%c柱子\n",n,A,C);
        然后执行: reutrn;
        pop栈:
        这一层执行完毕
    A5:   
        回到上一层:
        n==2;
        执行return;
        退出涵数,回到main()

      

程序代码:
# include <stdio.h>
void hanrota(int n,char A,char B,char C)
{
     if(1 == n)
    {
        printf("将编号为%d的盘子从%c柱子移到%c柱子\n",n,A,C);
    }
    else
    {
         hanrota(n-1,A,C,B);
         printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
         hanrota(n-1,B,A,C);

    }
    return;
}
int main()
{
    char ch1 ='A';
    char ch2 ='B';
    char ch3 ='C';
    int n;
    printf("请输入要移动的盘子个数: ");
    scanf_s("%d",&n);
    hanrota(n,'A','B','C');
    return 0;
}


[ 本帖最后由 cosam 于 2011-11-2 10:01 编辑 ]
2011-11-02 09:53
dreamsir
Rank: 1
等 级:新手上路
帖 子:10
专家分:3
注 册:2013-1-11
收藏
得分:0 
看完8楼大神的分析后,我想起了另一个问题,我想跳过这一章,不知道对今后的人生有影响没· ·
2013-06-04 15:51
快速回复:关于Hanoi塔的问题
数据加载中...
 
   



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

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