请教两道笔试题

时间:2008-05-22 08:59:09   来源:论坛整理  作者:  编辑:chinaitzhe
Q:
int calc(int x, int n)
{
int val=1;
if( n>0 ){
if( n%2==1 )
val=val*x;
val=val*calc(x*x, n/2);
}
return val;
}
问,这个函数的输出,原始是什么?
我运行了一下,是求 x的n次幂,但是程序看不懂,谁给我讲讲.....


Q:
void f1()
{
if(condition){
for(int i=0; i <100; i ){
doA.....
}
}else{
for(int i=0; i <100; i ){
doB.....
}
}
}

void f2(){
for(int i=0; i <100; i ){
if(condition){
doA.....
}else{
doB......
}
}
}

问:比较上面两个函数的优劣


谢谢........



网友回复:第二个问题,第一个函数效率高,只做了一次比较,但代码不简洁,第二个函数代码简洁单效率不如第一个,多比较了99次
网友回复:摘自林锐《高质量C /C编程指南》
for (i=0; i <N; i )
{
if (condition)
DoSomething();
else
DoOtherthing();
}

优点:程序简洁
缺点:多执行了N-1次逻辑判定,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。

if (condition)
{
for (i=0; i <N; i )
DoSomething();
}
else
{
for (i=0; i <N; i )
DoOtherthing();
}
优点:循环的效率高
缺点:程序不简洁


网友回复:1) 你看不明白就是因为对递归没有弄清楚,只有你自己在纸上 ,代入一个数据,
然后按程序一步一步写下去,去算才能使自己更明白,这是要自己 体会才有效的。


2)第一个高
因为 第一个 是一个判定后就 执行100次循环了
而第二个是 100 个循环里每次有2次判定。


网友回复:第一题是每次计算一个平方逐渐把指数化小,最后求出结果
网友回复:第一个问题:

calc(x, n) = 1 (n < 1)
x * calc(x*x, n/2) (n为奇数)
calc(x*x, n/2) (n为偶数)


比如(1)计算calc(10, 2),由于2是偶数,因此先计算calc(10, 2) = calc(10*10, 2/2)
= 100 * calc(100*100, 1/2)
= 1
因此,整个调用过程回收就是:calc(10, 2) = 100 * 1 = 100

再举个n = 3的例子:
(2)
calc(10, 3) = 10 * calc(10*10, 3/2)
= 100 * calc(100*100, 1/2)
= 1
整个调用过程回收得:10 * 100 * 1 = 1000

递归调用做乘法时是从右开始计算的,因为最后面的先返回。这也是出栈顺序,后进先出。
网友回复:第二道题目很明显是第一个效率要高些
第一道看不明白
关键字:请教,笔试,
上一篇:生日快乐

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面