| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1528 人关注过本帖
标题:谁的效率高?
只看楼主 加入收藏
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
 问题点数:0 回复次数:35 
谁的效率高?
/*符号*/
Sign(int k)
{if(k==0) return 1;
else if(k==1) return(-2);
}

void Calculate(int count,int sum)
{char i;
for(i=0;i<2;i++)
{sum=sum+Sign(i)*stone[count];
if(count > 0)
Calculate(count-1,sum);/*递归调用直到count等于0*/
else if(count == 0)
{sum_no++;/*sum_no <= pow(2,count)*/
if(sum >= 0)
{if(min_sum > sum)
{min_sum=sum;
me[0]=sum_no;
me_total=1;
}
else if(min_sum == sum)
{
if(me_total < 15) me[me_total]=sum_no;
me_total++;
}
}
}
}
}


我将以上的函数Calculate(int count,int sum)改成下面的样子,主要是红色部分.

half=pow(2,count-1);

void Calculate(int count,int sum)
{char i;
for(i=0;i<2 && sum_no<half;i++)
{
sum=sum+Sign(i)*stone[count];
if(count > 0)
Calculate(count-1,sum);/*递归调用直到count等于0*/
else if(count == 0)
{sum_no++;/*sum_no <= pow(2,count-1)*/
if(min_sum > abs(sum))
{min_sum=abs(sum);
me[0]=sum_no;
me_total=1;
}
else if(min_sum == abs(sum);)
{
if(me_total < 15) me[me_total]=sum_no;
me_total++;
}
}
}
}

没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了超过pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????

[此贴子已经被作者于2006-6-19 21:41:49编辑过]

搜索更多相关主题的帖子: 效率 
2006-06-19 21:36
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-19 22:16
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
以下是引用穆扬在2006-6-19 22:16:00的发言:
从效率的角度讲
应该先考虑把递归改成循环

另外我不清楚为什么要调用abs()
自己写一个表达式不就完了吗

你是说将abs()改为if(sum < 0) a=sum;else a=sum;
这样改跟直接调用差不多吧!!

从效率的角度讲
应该先考虑把递归改成循环-------->为什么??


Finding!!!
2006-06-19 22:25
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-19 22:27
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了超过pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????




那位可以回答我的问题!!!????

Finding!!!
2006-06-19 22:35
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
以下是引用songweiwen在2006-6-19 21:36:06的发言:

half=pow(2,count-1);

void Calculate(int count,int sum)
{char i;
for(i=0;i<2 && sum_no<half;i++)
{
sum=sum+Sign(i)*stone[count];
if(count > 0)
Calculate(count-1,sum);/*递归调用直到count等于0*/
else if(count == 0)
{sum_no++;/*sum_no <= pow(2,count-1)*/
if(min_sum > abs(sum))
{min_sum=abs(sum);
me[0]=sum_no;
me_total=1;
}
else if(min_sum == abs(sum);)
{
if(me_total < 15) me[me_total]=sum_no;
me_total++;
}
}
}
}

sum=abs(sum),这样可以省多少事?


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-19 22:46
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-19 22:48
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
俺没细看..那就再定义个变量呗..

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-19 22:50
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
sum的值是不可以改变的(在for语句里的i等于2前)
不好意思,我没说清楚!!也许我的函数也难明白一些!

Finding!!!
2006-06-19 22:52
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了超过pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????




那位可以回答我的问题!!!????

Finding!!!
2006-06-19 22:53
快速回复:谁的效率高?
数据加载中...
 
   



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

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