| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2913 人关注过本帖
标题:[原创]递归的艺术-递归程序的非递归化
只看楼主 加入收藏
wellerweldon
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2005-6-3
收藏
得分:0 
喔!竞争好激烈啊,不知在BCB6上是什么结果呢?等下我认真看看
2005-06-11 20:49
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
好! 何为BCB6(borland c++??)?是IDE的界面吗?不要在dos下运行的编译系统。
waiting you!

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-11 20:55
牛虻
Rank: 1
等 级:新手上路
威 望:1
帖 子:472
专家分:0
注 册:2004-10-1
收藏
得分:0 
我再问一下,那你保证你的VC每次测试都是40秒,且测试的数据结构都一样么?(在不运行其他程序的情况下)

土冒
2005-06-11 21:09
wellerweldon
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2005-6-3
收藏
得分:0 
还在忙,只是试了楼主的测试程序,楼主的时间测试是对的,排序确实如楼主所说
2005-06-11 21:25
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
回复牛虻:在类似vc的ide环境内的函数调用方式和在tc的dos环境方式下的函数调用方式不同!特别是调用bios等低层函数方面。这个问题我理解的不透彻就不谈了。我只知道printf("worst case resolution = %5.4f usec\n", resolution);的输出和 printf("meaningful precision = %d decimal digits\n", prec);的输出以及执行完 BEGIN_TEST("(cache & vm load)");END_TEST();的输出,在vc中每次都一样(我的机器每次都为:1000,100,和0.12),而在tc下差别极大(有时为0,有时为1万多),而下面的程序测试语句都是根据这三句的结果来作为测试的基准,我在tc下的测试,一会comb执行时间为0,而comb_w_w执行时间为1万多,一会它们又反过来了,这样的效果能用来判断程序的效率吗?我不知道是我的机器有问题还是tc环境下不适合做这种测试,我只知道在我的机器上用vc测试,每次得到的效率排序都是一样的:要么所有的测试结果都偏高一点,要么所有的测试结果都偏低但最终测试下来效率排序都是一样的(无论我运行多少次这个测试程序)。

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-11 21:32
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
回复wellerweldon:谢谢你的支持!

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-11 21:36
simpley
Rank: 1
等 级:新手上路
帖 子:262
专家分:0
注 册:2005-2-23
收藏
得分:0 
关于组合问题,因为没有VC,就不试了。

关于汉诺塔,我为什么认为效率是一样的呢?因为象
stack[top++]=n--;  t=y; y=z; z=t;这句话,虽然只有一个参数进栈,但实际上和4个参数进栈的复杂度是一样的,程序执行这句话应该和让4个参数进栈所花的时间是一样的。同理,出栈也一样。它的好处,就是我上面说的,由于栈小了,节省了内存。

myQQ::445750010
2005-06-11 22:56
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
我觉得我们的分歧在于:你是从大局出发,我从细微之处分析程序的结构。这些函数毕竟是我亲手编写,我觉得我已经掌握了程序中的细节。我再写一个四个参数都进栈的函数:
 void hanoi_all(int n,char x,char y,char z)  {
     struct  {
   int  n;
   char x;
   char y;
   char z;
  }s_all[100];  /*定义栈保存所有参数*/
     int topa=0;
  char t;
  while(n>1||top)  {
   if(n>1)  {
    s_all[top].n=n--;  s_all[top].x=x;  s_all[top].y=y;  s_all[top++].z=z;
    t=y; y=z; z=t;
   }
   else  {
    move(x,1,z);
    n=s_all[--top].n; x=s_all[top].x;  y=s_all[top].y;  z=s_all[top].z;
    move(x,n,z);
    --n;  t=x;  x=y;  y=t;
   }
  }
 }

    程序的效率体现在细微之处,我的观点是:在自己的能力范围内,能让程序效率多高就多高。
不知道我说:”hanoi_all函数的效率测试结果比hanoi_w_w(hanoi_w_if)好“你会不会相信?(反正你也没有vc++)
   好了,我不争论了,我太累了,要sleeping去了。
   对了,这个程序可以用”广度优先策略“重写其非递归算法,不知道simpley同学有没有这个兴趣改写一下?

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-11 23:29
牛虻
Rank: 1
等 级:新手上路
威 望:1
帖 子:472
专家分:0
注 册:2004-10-1
收藏
得分:0 
以下是引用stnlcd在2005-6-11 21:32:53的发言: 回复牛虻:在类似vc的ide环境内的函数调用方式和在tc的dos环境方式下的函数调用方式不同!特别是调用bios等低层函数方面。这个问题我理解的不透彻就不谈了。我只知道printf("worst case resolution = %5.4f usec\n", resolution);的输出和 printf("meaningful precision = %d decimal digits\n", prec);的输出以及执行完 BEGIN_TEST("(cache & vm load)");END_TEST();的输出,在vc中每次都一样(我的机器每次都为:1000,100,和0.12),而在tc下差别极大(有时为0,有时为1万多),而下面的程序测试语句都是根据这三句的结果来作为测试的基准,我在tc下的测试,一会comb执行时间为0,而comb_w_w执行时间为1万多,一会它们又反过来了,这样的效果能用来判断程序的效率吗?我不知道是我的机器有问题还是tc环境下不适合做这种测试,我只知道在我的机器上用vc测试,每次得到的效率排序都是一样的:要么所有的测试结果都偏高一点,要么所有的测试结果都偏低但最终测试下来效率排序都是一样的(无论我运行多少次这个测试程序)。
晓得了~

土冒
2005-06-12 09:43
simpley
Rank: 1
等 级:新手上路
帖 子:262
专家分:0
注 册:2005-2-23
收藏
得分:0 
关于组合问题我建议改变一下测试的数据,看看会有变化没有。
我分析楼主的最快的程序在K值变大时效率可能要变慢。

myQQ::445750010
2005-06-12 14:35
快速回复:[原创]递归的艺术-递归程序的非递归化
数据加载中...
 
   



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

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