| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 665 人关注过本帖
标题:求真相???
只看楼主 加入收藏
qq312154421
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:124
专家分:120
注 册:2010-6-7
结帖率:86.36%
收藏
已结贴  问题点数:20 回复次数:8 
求真相???
这是一个分盘子的题目
#include <stdio.h>
void hanoi(int n,char one,char twe,char three);
void nove(char x,char y);
void main()
{
    hanoi(3,'a','b','c');
}
void hanoi(int n,char one,char two,char three)
{
    if(n==1)
        nove(one,three);
    else
    {
       hanoi(n-1,one,three,two);
       nove(one,three);
       hanoi(n-1,two,one,three);
    }
}
void nove(char x,char y)
{
    printf("%c-->%c\n",x,y);
}
红色的那一段代码,具体是怎么执行的,求真相?
搜索更多相关主题的帖子: void include 
2011-02-01 12:47
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:5 
不断入栈与不断退栈,结束递归条件是if(n==1)

小代码,大智慧
2011-02-01 12:54
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:5 
以下是引用点线面在2011-2-1 12:54:40的发言:

不断入栈与不断退栈,结束递归条件是if(n==1)



就这么简单??

without further ado, let’s get started
2011-02-01 13:04
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
以下是引用iFreeBSD在2011-2-1 13:04:05的发言:

 
 
 
就这么简单??
不简单,可以写出来,不过麻烦。

小代码,大智慧
2011-02-01 13:12
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:5 
可以看严蔚敏和吴伟民的数据结构,里面有这个例程使用栈时具体的对栈的操作情况,讲的超级详细
2011-02-01 13:18
icebergwang
Rank: 2
来 自:河北廊坊
等 级:论坛游民
帖 子:17
专家分:19
注 册:2011-1-8
收藏
得分:5 
这个写出来稍微有点麻烦,楼主可以看看函数递归调用方面的知识。递归调用,不断开辟重名存储单元,直到递归调用结束再逐一释放

跟着感觉走,欲速则不达
2011-02-01 13:30
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
写一小段伪代码
h(3,a,b,c)
{
   h(2,a,c,b);
   n
   h(2);
}

h(2,a,c,b)
{
   h(1,a,b,c);
   n
   h(1);
}

h(1,a,b,c)
{
   printf   a->c
}

h(2,a,c,b)
{
    prinf   a->b
    h(1,c,a,b)
}

h(1,c,a,b)
{
    printf  c->b   
}
...
不知道楼主明白不

小代码,大智慧
2011-02-01 13:42
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
完整分析,细节上不明白可以继续问,本人菜鸟,有不对地方,望高手指教.
hanoi(3,a,b,c)      //生成最先入栈的函数
{

   if(0)            //约束条件还没有触发,所以执下面语句
 
   hanoi(2,a,c,b);  //这个准备入栈
   nove(a,c);       //等上面函数执行完,才执行这个
   hanoi(2,b,a,c);  //等上面函数执行完,才执行这个
}

hanoi(2,a,c,b)      //第二个入栈函数
{
   if(0)            //约束条件还没有触发,所以执下面语句
   hanoi(1,a,b,c);  //这个准备入栈
   nove(a,b);       //等上面函数执行完,才执行这个
   hanoi(1,c,a,b);  //等上面函数执行完,才执行这个
}

hanoi(1,a,b,c)       //执完这个函数,退栈hanoi(2,a,c,b)
{
   if(1)             //约束条件触发,所以打印出语句
   printf   a->c
}

hanoi(2,a,c,b)          //指向这个函数
{
   if(0)            //约束条件还没有触发,所以执下面语句
   hanoi(1,a,b,c);  //这个执行完,所以执行下面语句
   nove(a,b);       //打印 printf   a->b
   hanoi(1,c,a,b);  //准备入栈
}

hanoi(1,c,a,b)     //执完这个函数,退栈hanoi(3,a,b,c)  
{
  if(1)            //约束条件触发,所以打印出语句
    printf  c->b   
}

hanoi(3,a,b,c)      //执行这个函数
{

   if(0)            //约束条件还没有触发,所以执下面语句
 
   hanoi(2,a,c,b);  //执行完这个函数,开始执行下面函数
   nove(a,c);       //打印 printf   a->c
   hanoi(2,b,a,c);  //准备入栈
}

   hanoi(2,b,a,c)   //再一次,再行这个函数
{
    if(0)           //约束条件还没有触发,所以执下面语句
   hanoi(1,b,c,a);  //这个准备入栈
   nove(b,c);       //等上面函数执行完,才执行这个
   hanoi(1,a,b,c);  //等上面函数执行完,才执行这个
}

hanoi(1,b,c,a)     //执完这个函数,退栈hanoi(2,b,a,c)
{
  if(1)            //约束条件触发,所以打印出语句
    printf  b->a   
}

   hanoi(2,b,a,c)   //执行这个函数
{
    if(0)           //约束条件还没有触发,所以执下面语句
   hanoi(1,b,c,a);  //这个函数己经完成
   nove(b,c);       //执行这个函数,开始打印  b->c
   hanoi(1,a,b,c);  //准备入栈
}

hanoi(1,a,b,c)     //执完这个函数,退栈hanoi(3,a,b,c)
{
  if(1)            //约束条件触发,所以打印出语句
    printf  a->c   
}

hanoi(3,a,b,c)    //最后出栈,划上句号

小代码,大智慧
2011-02-01 14:32
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
之前还是有些漏,现在补充,望高手指教一下

hanoi(3,a,b,c)      //执行这个函数
{

   if(0)            //约束条件还没有触发,所以执下面语句
   ...

   hanoi(2,a,c,b);  //准备调用hanoi(2,a,c,b),这个所谓"自己调用自己"迫使hanoi(3,a,b,c)入栈,保留hanoi(3,a,b,c)一些数据
   nove(a,c);       //等上面函数执行完,才执行这个
   hanoi(2,b,a,c);  //等上面函数执行完,才执行这个
}

hanoi(2,a,c,b)      //执行hanoi(2,a,c,b)函数,从头执行到尾
{
   if(0)            //约束条件还没有触发,所以执下面语句
   ...

   hanoi(1,a,b,c);  //准备调用hanoi(1,a,b,c),迫使hanoi(2,a,c,b)入栈,保留hanoi(2,a,c,b)一些数据
   nove(a,b);       //等上面函数执行完,才执行这个
   hanoi(1,c,a,b);  //等上面函数执行完,才执行这个
}

hanoi(1,a,b,c)       //执行完这个函数,退栈hanoi(2,a,c,b),记住从那地方调用,就从那地方回去,执行下一条语句.
{
   if(1)             //约束条件触发,所以打印出语句
   printf   a->c
}

hanoi(2,a,c,b)      //执行这个函数,记住从那地方调用,就从那地方回去.
{
   if(0)            //约束条件还没有触发,所以执下面语句
   ...
   hanoi(1,a,b,c);  //这个执行完,所以执行下面语句
   nove(a,b);       //打印 printf   a->b
   hanoi(1,c,a,b);  //准备调用hanoi(1,c,a,b),迫使hanoi(2,a,c,b)入栈,保留hanoi(2,a,c,b)一些数据
}

hanoi(1,c,a,b)     //执完这个函数,退栈hanoi(2,a,c,b), 记住从那地方调用,就从那地方回去,执行下一条语句.
{
  if(1)            //约束条件触发,所以打印出语句
    printf  c->b   
}

hanoi(2,a,c,b)     //下面没有执行语句,结束这个函数,现在退栈hanoi(3,a,b,c), 记住从那地方调用,就从那地方回去,执行下一条语句.
{}

hanoi(3,a,b,c)      //执行这个函数
{

   if(0)            //约束条件还没有触发,所以执下面语句
   ...
   hanoi(2,a,c,b);  //执行完这个函数,开始执行下面函数
   nove(a,c);       //打印 printf   a->c
   hanoi(2,b,a,c);  //准备调用hanoi(2,b,a,c),迫使hanoi(3,a,b,c)入栈,保留hanoi(3,a,b,c)一些数据
}

   hanoi(2,b,a,c)   //再一次,再行这个函数
{
    if(0)           //约束条件还没有触发,所以执下面语句
    ...
   hanoi(1,b,c,a);  //准备调用hanoi(1,b,c,a),迫使hanoi(2,b,a,c)入栈,保留hanoi(2,b,a,c)一些数据
   nove(b,c);       //等上面函数执行完,才执行这个
   hanoi(1,a,b,c);  //等上面函数执行完,才执行这个
}

hanoi(1,b,c,a)     //执完这个函数,退栈hanoi(2,b,a,c),记住从那地方调用,就从那地方回去,执行下一条语句.
{
  if(1)            //约束条件触发,所以打印出语句
    printf  b->a   
}

   hanoi(2,b,a,c)   //继续执行这个函数
{
    if(0)           //约束条件还没有触发,所以执下面语句
     ...
   hanoi(1,b,c,a);  //这个函数己经完成
   nove(b,c);       //执行这个函数,开始打印  b->c
   hanoi(1,a,b,c);  //准备调用hanoi(1,a,b,c),迫使hanoi(2,b,a,c)入栈,保留hanoi(2,b,a,c)一些数据
}


hanoi(1,a,b,c)     //执完这个函数,退栈hanoi(2,b,a,c),记住从那地方调用,就从那地方回去,顺便执行下一条语句.
{
  if(1)            //约束条件触发,所以打印出语句
    printf  a->c   
}

 hanoi(2,b,a,c)   //下面没有执行语句,结束这个函数,现在退栈hanoi(3,a,b,c), 记住从那地方调用,就从那地方回去,执行下一条语句.
{}

hanoi(3,a,b,c)    //下面没有执行语句,结束这个函数,出栈与入栈在这里划上句号.
{}
p.s 这个最好有汇编基础,不然不好明白

[ 本帖最后由 点线面 于 2011-2-1 16:11 编辑 ]

小代码,大智慧
2011-02-01 16:01
快速回复:求真相???
数据加载中...
 
   



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

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