CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

一道C语言题目,不知道怎么做

楼主eimhee()2006-10-23 12:29:36 在 C/C++ / C语言 提问

3.   Consider   the   following   code   segment:  
   
  int     foo   (   int   x   ,   int     n)  
   
  {  
   
      int   val;  
   
      val   =1;  
   
       
   
      if   (n>0)    
   
      {  
   
          if   (n%2   ==   1)     val   =   val   *x;  
   
           
   
          val   =   val   *   foo(x*x   ,   n/2);  
   
      }  
   
      return   val;  
   
  }  
   
  What   function   of   x   and   n   is   compute   by   this   code   segment?        
   
  (a)   x^n  
  (b)   x*n  
  (c)   n^x  
  (d)   None   of   the   above  
   
  问题点数:10、回复次数:43Top

1 楼mu_yang(穆扬)回复于 2006-10-23 12:35:37 得分 0

比较变态的题目Top

2 楼Kusk(Kusk)回复于 2006-10-23 12:36:12 得分 0

a.  
  是用递归的思想,求x的n次方,原理如下:  
  如果n   ==   0,则返回1;否则:  
  如果n是偶数,设n=2k,则x^n   =   x^(2k)=(x*x)^k  
  如果n是奇数,设n=2k+1,则x^n=   x^(2k)   *   xTop

3 楼pcboyxhy(-273.15℃)回复于 2006-10-23 12:42:03 得分 0

x^nTop

4 楼xxyyboy(壮志凌云)(★★★★★)回复于 2006-10-23 12:53:43 得分 0

int     foo   (   int   x   ,   int     n)  
  {  
      int   val   =1;  
      if   (n>0)     //n为整数  
      {  
          if   (n%2   ==   1)//看n是不是2的倍数,是下1步,不是下2步。  
                {val   =   val   *x;}//是2的倍数   乘,乘完接着下1步。  
          val   =   val   *   foo(x*x   ,   n/2);//   自己调用自己,递归  
      }  
      return   val;  
  }  
   
  n做为递归终止的条件,n=n/2,什么时候满足   n>0条件   什么时候退出,不考虑n的类型,n/2   趋向于0,但永远!=0,这里投机取巧,应为int/int   计算机只取整数部分,个人觉得所以这个程序。。。     very   bad.  
  Top

5 楼xxyyboy(壮志凌云)(★★★★★)回复于 2006-10-23 12:55:10 得分 0

程序看懂了,结果我就不说了。Top

6 楼Kusk(Kusk)回复于 2006-10-23 13:15:30 得分 0

楼上的逻辑混乱连取模运算都看错,又把数学中的除法运算和计算机中的整除运算混为一谈。Top

7 楼blue_zyb()回复于 2006-10-23 13:36:43 得分 0

个人觉得所以这个程序。。。     very   bad.  
  -------------------------------------  
  这个算法比一般的计算幂次要快。。。Top

8 楼mu_yang(穆扬)回复于 2006-10-23 13:54:09 得分 0

这个算法比一般的计算幂次要快。。。  
  ------------------------------------  
  根据何在?Top

9 楼Kusk(Kusk)回复于 2006-10-23 13:56:45 得分 0

回复人:mu_yang(穆扬)   (   二级(初级))   信誉:96   2006-10-23   13:54:00   得分:0  
  ?    
  这个算法比一般的计算幂次要快。。。  
  ------------------------------------  
  根据何在?  
  ------------------------------------  
  因为它的复杂度是对数级的。Top

10 楼mu_yang(穆扬)回复于 2006-10-23 14:02:05 得分 0

因为它的复杂度是对数级的。  
  -------------------------------  
  1.但程序的复杂性是指数级的  
  2.两个形参都是int   ,返回值也是int  
  计算量不大,追求速度我认为得不偿失  
  3.如果你的道理成立  
  if   (n%3   ==   1)     val   =   val   *x;  
  if   (n%3   ==   2)     val   =   val   *x   *x;  
  val   =   val   *   foo(x*x*x   ,   n/3);  
  应该更快  
  Top

11 楼Kusk(Kusk)回复于 2006-10-23 14:10:10 得分 0

1.但程序的复杂性是指数级的  
  -----------------------  
  不知道什么是“程序的复杂性”。  
   
  2.两个形参都是int   ,返回值也是int  
  计算量不大,追求速度我认为得不偿失  
  --------------------  
  那是另一个问题。算法的价值在于思想,不能用肤浅的应用来衡量其价值。  
   
  3.如果你的道理成立  
  if   (n%3   ==   1)   val   =   val   *x;  
  if   (n%3   ==   2)   val   =   val   *x   *x;  
  val   =   val   *   foo(x*x*x   ,   n/3);  
  应该更快  
  -------------  
  你仔细验证一下乘法的计算次数就知道你所臆想的“应该更快”是不正确的。Top

12 楼mu_yang(穆扬)回复于 2006-10-23 14:36:27 得分 0

1.不知道什么是“程序的复杂性”。  
  ---------------------------------  
  我是指代码的晦涩难懂  
   
  2.那是另一个问题。算法的价值在于思想,不能用肤浅的应用来衡量其价值。  
  ---------------------------------  
  代码的价值:我是把可读性放在速度前面的  
  再说这代码我也没看出有什么思想性  
   
  3.你仔细验证一下乘法的计算次数就知道你所臆想的“应该更快”是不正确的  
  ---------------------------------------------------------------  
  谢谢你  
  我会仔细验证一下  
   
  Top

13 楼mu_yang(穆扬)回复于 2006-10-23 21:07:21 得分 0

我验证了一下  
   
  主帖:  
  递归调用次数~log2(n)(表示以2为底的对数)  
  实参为偶时   4次乘除(含求余   除2)    
  实参为奇时   5次乘除(含求余   除2)  
  平均   4.5log2(n)次乘除  
   
  我的例子:  
  递归调用次数~log3(n)  
  实参为3m+1时   7次乘除(含求余   除以3)  
  实参为3m+2时   8次乘除(含求余   除以3)  
  实参为3m时   6次乘除(含求余   除以3)  
  平均   7log3(n)次乘除  
   
  4.5log2(n)/7log3(n)~4.5*ln3/7*ln2~1.0189  
   
  结论:后者比前者快约1.89%  
   
  我所臆想的“应该更快”是不正确的吗?Top

14 楼Kusk(Kusk)回复于 2006-10-23 21:26:47 得分 0

不知道你的7次乘除8次乘除怎么来的。下面是我的推导,二分法是较优的:  
   
   
  设二分法求解时n次幂要做g(n)个乘法,就有  
  g(n)等于  
  1)g(n/2)   +   1,当n为偶数,   (根据f(x,n)=f(x   *   x,   n/2),右边多算一个乘)  
  2)或g(n   /   2)   +   2,当n为奇数。(根据f(x,n)=f(x*x,   n   /   2)   *   x),右边多两个乘)  
  3)0,当n   =   0  
   
  三分的时候设n次幂要做h(n)个乘法,同样有  
  h(n)等于  
  1)h(n   /   3)   +   2,   when   n   %   3   ==   0  
  2)h(n   /   3)   +   3,   when   n   %   3   ==   1  
  3)   h(n   /   3)   +   4,   when   n   %   3   ==   2  
  4)0,当n   =   0  
   
  不考虑n=0,则g(n)平均每次做1.5个乘法,h(n)每次3个,而g(n),f(n)分别进行  
  lg(2,   n)及lg(3,   n)次迭代,所以乘法数之比为:  
  2分:3分=(1.5lg(2,   n)   /   3lg(3,   n))   =   0.5   *   (lg3/lg2)   ~   0.79  
   
  二分法还是略优于于分法。当然如果考虑除法的话就改一下log的系数,结果  
  增为0.990.   只不过一般二分法的除二运算可以换为比除法快数百倍的位移运算,  
  所以一般计算二分法效率不考虑除法而只考虑乘法次数。Top

15 楼myjava_024()回复于 2006-10-23 21:28:06 得分 0

答案是a  
  在好多时候递归调用是真迷惑人啊      
  小心!Top

16 楼mu_yang(穆扬)回复于 2006-10-23 22:14:40 得分 0

不知道你的7次乘除8次乘除怎么来的。  
  -------------------------------------------  
  if   (n>0)    
      {  
          if   (n%2   ==   1)     val   =   val   *x;        
          val   =   val   *   foo(x*x   ,   n/2);  
      }  
  对奇数实参:  
  n%2  
  val   *x  
  val   *   foo  
  x*x  
  n/2  
  共5次乘除  
  对偶数实参:  
  n%2  
  val   *   foo  
  x*x  
  n/2  
  共4次乘除  
   
  三分同理  
  Top

17 楼jietian()回复于 2006-10-23 22:22:20 得分 0

bt的程序  
  中国的题都喜欢这样  
  要么就是指针的指针的指针的指针是什么啊  
  这些烦死人了!Top

18 楼xiaoke26(带三个表)回复于 2006-10-23 22:48:31 得分 0

这个是原来英文的回答:  
  The   answer   is   (a)  
   
  Non   recursive   version   of   the   program  
   
  int     what   (   int   x   ,   int     n)  
   
  {  
   
      int   val;  
   
      int   product;  
   
      product   =1;  
   
      val   =x;  
   
     
   
      while(n>0)  
   
      {  
   
          if   (n%2   ==   1)    
   
              product   =   product*val;  
   
          n   =   n/2;  
   
          val   =   val*   val;  
   
      }  
   
  }  
   
  /*   Code   raise   a   number   (x)   to   a   large   power   (n)   using   binary   doubling   strategy   */  
  Algorithm   description  
   
  (while   n>0)    
   
  {  
   
      if     next   most   significant   binary   digit   of     n(   power)     is   one  
   
      then   multiply   accumulated   product   by   current   val     ,  
   
      reduce   n(power)     sequence   by   a   factor   of   two   using   integer   division   .  
   
      get   next   val   by   multiply   current   value   of   itself                                      
   
  }Top

19 楼vegetable_king()回复于 2006-10-23 23:00:57 得分 0

看不懂 啊  我晕    
  怎么会选a   啊 郁闷   
    if   (n>0)    
   
      {  
   
          if   (n%2   ==   1)     val   =   val   *x;  
   
           
   
          val   =   val   *   foo(x*x   ,   n/2);  
   
      }  
  这里如果n为偶数的话 n/2不也是偶数吗??  
   val=1   则 val=1*1啊  不就都是等于1了吗 ??  
  如果是奇数还说得过去Top

20 楼wormOK(笨笨)回复于 2006-10-23 23:09:19 得分 0

出乎意料的方法,学着用了,呵呵。。Top

21 楼jklangel()回复于 2006-10-23 23:20:24 得分 0

我觉得如何是考试的话,直接挑两个简单的数代进去算,  
   
  再与选择核对,看哪个一样,就选哪个  
   
  当然,如果是抱以学习的态度,是要弄懂原因的Top

22 楼Kusk(Kusk)回复于 2006-10-23 23:41:28 得分 0

mu_yang(穆扬)   (   二级(初级))   信誉:96   2006-10-23   22:14:00   得分:0  
  ----------------------------------------------------------  
  了解。Top

23 楼icansaymyabc(学习与进步)回复于 2006-10-24 09:54:29 得分 0

这是一个典型的用空间换时间的求   x^n   的算法改进。  
   
  相比于传统的   x^n=f(x,n){int   val=1;   for(int   i=2;i<=n;i++)val   *=x;return   val;}来说,  
  传统算法的空间复杂度是   O(1),   时间复杂度是   O(n);  
   
  而这种改进算法的   空间复杂度和时间复杂度都是   O(log   n)。  
   
  时间上达到了最优化,但是空间的要求却增加不大。  
   
  例如:计算   2^18446744073709551616,  
    传统   O(n)   算法需要做18446744073709551616次乘法,就算在当今最快的计算机上也要用年为单位统计程序执行时间;没有附加的空间需求。  
   
    而改进的   O(log   n)   算法仅需要   64   次递归,要作128次减法+192次乘法;空间消耗要求增加   64*m(m是每次递归调用需要的栈开销大概是64-128byte)byte。就算在内存不大的低档计算机内也是毫秒级的完成时间。Top

24 楼michaelysj(其实我很傻...)回复于 2006-10-24 09:58:13 得分 0

markTop

25 楼icansaymyabc(学习与进步)回复于 2006-10-24 10:04:59 得分 0

按照   foo   的算法,一个人花有限的时间就能手工计算出   x^99999999999999999999   这样巨大的数。但是要按传统算法一个一个地手工硬乘的话,一个人花100辈子也求不出这个数来吧!?  
   
  所以楼上说这个算法很无聊的同志该努力学习了。Top

26 楼luoqintao(tooluck)回复于 2006-10-24 10:13:34 得分 0

x^nTop

27 楼qxbnit(蓝灵)回复于 2006-10-24 10:24:31 得分 0

楼上两位“讨论激烈”的boys~~  
   
  虽然我比较愚笨,数学不怎么好,,  
   
  但我还是比较支持,“mu_yang(穆扬”  
   
  理由很简单啊:字面理解-->三次分肯定比两次分减少乘法的数目多-->以此效率也高  
   
  就象两次分比x^n   =   x*x*x~n强一样  
  Top

28 楼youzelin()回复于 2006-10-24 12:36:58 得分 0

icansaymyabc(学习与进步)   (   )   信誉:100         Blog     2006-10-24   09:54:00     得分:   0      
     
     
        这是一个典型的用空间换时间的求   x^n   的算法改进。  
   
  相比于传统的   x^n=f(x,n){int   val=1;   for(int   i=2;i<=n;i++)val   *=x;return   val;}来说,  
  传统算法的空间复杂度是   O(1),   时间复杂度是   O(n);  
   
  而这种改进算法的   空间复杂度和时间复杂度都是   O(log   n)。  
   
  时间上达到了最优化,但是空间的要求却增加不大。  
   
  例如:计算   2^18446744073709551616,  
    传统   O(n)   算法需要做18446744073709551616次乘法,就算在当今最快的计算机上也要用年为单位统计程序执行时间;没有附加的空间需求。  
   
    而改进的   O(log   n)   算法仅需要   64   次递归,要作128次减法+192次乘法;空间消耗要求增加   64*m(m是每次递归调用需要的栈开销大概是64-128byte)byte。就算在内存不大的低档计算机内也是毫秒级的完成时间。  
       
  ===================================================================================  
   
  谢谢,路过,学习!  
     
  Top

29 楼lurenfu(具有中国特色的社会主义初级阶段,一百年不变)回复于 2006-10-24 12:39:47 得分 0

楼上的,你的确比较愚笨  
   
  同意Kush和icansaymyabc(学习与进步)    
   
  这是一个计算幂的快速算法Top

30 楼lurenfu(具有中国特色的社会主义初级阶段,一百年不变)回复于 2006-10-24 12:40:18 得分 0

不好意思,有人插队了  
   
  错了,我指的是我楼上的楼上Top

31 楼mu_yang(穆扬)回复于 2006-10-24 12:46:16 得分 0

例如:计算   2^18446744073709551616,  
  ------------------------------------------  
  题目的背景不是这样的  
  从  
  int     foo   (   int   x   ,   int     n)  
  就能看出来  
   
  如果是计算2^18446744073709551616  
  这种极端的特例  
  那+-*/这些最基本的运算都必须重新考虑Top

32 楼vegetable_king()回复于 2006-10-24 12:46:59 得分 0

好象有一点点 通了   
  哎  我C学的太差了   
  我还要看看Top

33 楼qxbnit(蓝灵)回复于 2006-10-24 13:00:18 得分 0

 
  to   lurenfu(别理我,烦着呢!)   :  
   
          我好象说的也是计算幂吧……??!!  
   
  Top

34 楼Kusk(Kusk)回复于 2006-10-24 13:16:12 得分 0

回复人:qxbnit(蓝灵)   (   一级(初级))   信誉:100   2006-10-24   10:24:00   得分:0  
  ?    
  楼上两位“讨论激烈”的boys~~  
   
  虽然我比较愚笨,数学不怎么好,,  
   
  但我还是比较支持,“mu_yang(穆扬”  
   
  理由很简单啊:字面理解-->三次分肯定比两次分减少乘法的数目多-->以此效率也高  
   
  就象两次分比x^n   =   x*x*x~n强一样  
  --------------------------------------------------------------------  
  三次分肯定比两次分减少乘法的数目多-->以此效率也高  
   
  这步的推导是错误的。你只看到了三分法收敛得比二分法快,但没有看到你在做三分的时候  
  每从x   ^   n到(x   *   x   *   x)   ^   (n/3)降一次就多算两个乘法(x   *   x   *   x),而二分时每从x   ^   n到(x   *   x)   ^   (n   /   2)的时候  
  则只多需算一个乘法(x   *   x)。且不说除二运算可以转化为移位运算本身就比除以3的方法快了上百倍,  
  就问题本身而言除2是最高层次分治。这也是为什么通常的分治都是采用二分的原因。认为除3比除2  
  好的朋友可以思考一下为什么归并排序、快速排序不是将数组三分、四分、N分而是二分?为什么有二分  
  查找却从来没有什么人提倡过什么三分查找、四分查找、N分查找?这些理论上并非不可行,但实质上  
  不会带来效率的提高,因为在分得多的同时,每一份分得的最单位需要做的计算量也相应提高了,就  
  像如果有三分归并排序的话到最后要比较出三个数的大小,还是要比二分归并花的时间多;就像我们  
  这个例子,若是分成三份的话,每一份要做的平均乘法数量就要增加一样。把二分改为多分反而降低  
  了分治的程度,因为分到最后不能再分时要处理的元素个数增加了,实际上这增加了线性计算的程度,  
  降低了分治的程度。极端一点,如果分得越多越好,那我干脆分成n份,就变成直接求x   *   x   *   ...   *   x,  
  也就是n个x相乘了!分倒是一次分完了,但之后呢?你只能通过线性的方法线性的复杂度去求n个x  
  的积!所以分得多反而只能使算法贴进线性复杂度而不是对数复杂度。二分是分得最少的,所以几乎  
  一切线性有关的分解都采用二分。  
   
  分治已经是算法降解的实质,分多分少只量上的差别,但不能从本质上降低求解的复杂度。其实这种问题根本不需要定量去计算,基本思维观念正确的人一眼就可以看出这一点。Top

35 楼qxbnit(蓝灵)回复于 2006-10-24 14:30:29 得分 0

 
  被你说服了,,不过好象在n小的时候,这个算法与传统的相比并不占优势!  
   
  不过二分的确比三分有效率,单从乘法的角度考虑  
  我疏忽了三分余数部分的乘法  
   
  count2   1   if   n   =   0  
  count2   3   if   n   =   1  
  count2   5   if   n   =   2  
  count2   7   if   n   =   4  
  count2   8   if   n   =   0  
  count2   10   if   n   =   1  
  count2   12   if   n   =   2  
  count2   14   if   n   =   4  
  ----------foo2(2,4)   =   16----------  
  count3   2   if   n   =   0  
  count3   5   if   n   =   1  
  count3   8   if   n   =   4  
  count3   10   if   n   =   0  
  count3   13   if   n   =   1  
  count3   16   if   n   =   4  
  ----------foo3(2,4)   =   16----------  
  count2   2   if   n   =   0  
  count2   4   if   n   =   1  
  count2   6   if   n   =   2  
  count2   8   if   n   =   5  
  count2   10   if   n   =   10  
  count2   12   if   n   =   20  
  count2   14   if   n   =   40  
  count2   16   if   n   =   0  
  count2   18   if   n   =   1  
  count2   20   if   n   =   2  
  count2   22   if   n   =   5  
  count2   24   if   n   =   10  
  count2   26   if   n   =   20  
  count2   28   if   n   =   40  
  ----------foo2(2,40)   =   0----------  
  count3   4   if   n   =   0  
  count3   7   if   n   =   1  
  count3   10   if   n   =   4  
  count3   13   if   n   =   13  
  count3   16   if   n   =   40  
  count3   20   if   n   =   0  
  count3   23   if   n   =   1  
  count3   26   if   n   =   4  
  count3   29   if   n   =   13  
  count3   32   if   n   =   40  
  ----------foo3(2,40)   =   0----------  
  count2   3   if   n   =   0  
  count2   5   if   n   =   1  
  count2   7   if   n   =   3  
  count2   9   if   n   =   6  
  count2   11   if   n   =   12  
  count2   13   if   n   =   25  
  count2   15   if   n   =   50  
  count2   17   if   n   =   100  
  count2   19   if   n   =   200  
  count2   21   if   n   =   400  
  count2   24   if   n   =   0  
  count2   26   if   n   =   1  
  count2   28   if   n   =   3  
  count2   30   if   n   =   6  
  count2   32   if   n   =   12  
  count2   34   if   n   =   25  
  count2   36   if   n   =   50  
  count2   38   if   n   =   100  
  count2   40   if   n   =   200  
  count2   42   if   n   =   400  
  ----------foo2(2,400)   =   0----------  
  count3   8   if   n   =   0  
  count3   11   if   n   =   1  
  count3   14   if   n   =   4  
  count3   17   if   n   =   14  
  count3   20   if   n   =   44  
  count3   23   if   n   =   133  
  count3   26   if   n   =   400  
  count3   34   if   n   =   0  
  count3   37   if   n   =   1  
  count3   40   if   n   =   4  
  count3   43   if   n   =   14  
  count3   46   if   n   =   44  
  count3   49   if   n   =   133  
  count3   52   if   n   =   400  
  ----------foo3(2,400)   =   0----------  
  count2   6   if   n   =   0  
  count2   8   if   n   =   1  
  count2   10   if   n   =   3  
  count2   12   if   n   =   7  
  count2   14   if   n   =   15  
  count2   16   if   n   =   31  
  count2   18   if   n   =   62  
  count2   20   if   n   =   125  
  count2   22   if   n   =   250  
  count2   24   if   n   =   500  
  count2   26   if   n   =   1000  
  count2   28   if   n   =   2000  
  count2   30   if   n   =   4000  
  count2   36   if   n   =   0  
  count2   38   if   n   =   1  
  count2   40   if   n   =   3  
  count2   42   if   n   =   7  
  count2   44   if   n   =   15  
  count2   46   if   n   =   31  
  count2   48   if   n   =   62  
  count2   50   if   n   =   125  
  count2   52   if   n   =   250  
  count2   54   if   n   =   500  
  count2   56   if   n   =   1000  
  count2   58   if   n   =   2000  
  count2   60   if   n   =   4000  
  ----------foo2(2,4000)   =   0----------  
  count3   8   if   n   =   0  
  count3   11   if   n   =   1  
  count3   14   if   n   =   5  
  count3   17   if   n   =   16  
  count3   20   if   n   =   49  
  count3   23   if   n   =   148  
  count3   26   if   n   =   444  
  count3   29   if   n   =   1333  
  count3   32   if   n   =   4000  
  count3   40   if   n   =   0  
  count3   43   if   n   =   1  
  count3   46   if   n   =   5  
  count3   49   if   n   =   16  
  count3   52   if   n   =   49  
  count3   55   if   n   =   148  
  count3   58   if   n   =   444  
  count3   61   if   n   =   1333  
  count3   64   if   n   =   4000  
  ----------foo3(2,4000)   =   0----------  
   
   
  Terminated   with   return   code   0  
  Press   any   key   to   continue   ...  
   
  Top

36 楼qxbnit(蓝灵)回复于 2006-10-24 15:06:43 得分 0

#include   <stdio.h>  
  int   count2   =   0;  
  int   count3   =   0;  
   
  double     foo2   (double   x   ,   int     n)  
  {  
      double   val;  
      val   =1.0;  
      if   (n>0)    
      {  
          if   (n%2   ==   1){  
  val   =   val   *x;  
  count2++;  
  }  
          val   =   val   *   foo2(x*x   ,   n/2);  
  count2+=1;//x*x:只计算一次就够了  
      }  
      printf("count2   %d   if   n   =   %d   \n"   ,   count2+1   ,   n);  
      return   val;  
  }  
   
  double   foo3(double   x   ,   int   n){  
  double   val;  
  val   =1.0;  
  if   (n>0)    
  {  
  if   (n%3   ==   1){  
  val   =   val   *x;  
  count3++;  
  }  
  if   (n%3   ==   2){  
  val   =   val   *x   *x;  
  count3+=2;  
  }  
  val   =   val   *   foo3(x*x*x   ,   n/3);  
  count3+=1;//x*x*x:只计算一次就够了  
  }  
  printf("count3   %d   if   n   =   %d   \n"   ,   count3+1   ,   n);  
  return   val;  
  }  
   
  int   main(){  
  count2   =   0;  
  count3   =   0;  
  foo2(1.1,4);  
  printf("----------foo2(1.1,4)   =   %f----------\n",foo2(1.1,4));  
  foo3(1.1,4);  
  printf("----------foo3(1.1,4)   =   %f----------\n",foo3(1.1,4));  
   
  count2   =   0;  
  count3   =   0;  
  foo2(1.1,8);  
  printf("----------foo2(1.1,8)   =   %f----------\n",foo2(1.1,8));  
  foo3(1.1,8);  
  printf("----------foo3(1.1,8)   =   %f----------\n",foo3(1.1,8));  
   
  count2   =   0;  
  count3   =   0;  
  foo2(1.1,6);  
  printf("----------foo2(1.1,6)   =   %f----------\n",foo2(1.1,6));  
  foo3(1.1,6);  
  printf("----------foo3(1.1,6)   =   %f----------\n",foo3(1.1,6));  
   
  count2   =   0;  
  count3   =   0;  
  foo2(1.1,12);  
  printf("----------foo2(1.1,12)   =   %f----------\n",foo2(1.1,12));  
  foo3(1.1,12);  
  printf("----------foo3(1.1,12)   =   %f----------\n",foo3(1.1,12));  
   
  count2   =   0;  
  count3   =   0;  
  foo2(1.1,7);  
  printf("----------foo2(1.1,7)   =   %f----------\n",foo2(1.1,7));  
  foo3(1.1,7);  
  printf("----------foo3(1.1,7)   =   %f----------\n",foo3(1.1,7));  
   
  count2   =   0;  
  count3   =   0;  
  foo2(1.1,14);  
  printf("----------foo2(1.1,14)   =   %f----------\n",foo2(1.1,14));  
  foo3(1.1,14);  
  printf("----------foo3(1.1,14)   =   %f----------\n",foo3(1.1,14));  
  }  
   
  结果:  
   
  count2   2   if   n   =   0  
  count2   3   if   n   =   1  
  count2   4   if   n   =   2  
  count2   5   if   n   =   4  
  count2   6   if   n   =   0  
  count2   7   if   n   =   1  
  count2   8   if   n   =   2  
  count2   9   if   n   =   4  
  ----------foo2(1.1,4)   =   1.464100----------  
  count3   3   if   n   =   0  
  count3   4   if   n   =   1  
  count3   5   if   n   =   4  
  count3   7   if   n   =   0  
  count3   8   if   n   =   1  
  count3   9   if   n   =   4  
  ----------foo3(1.1,4)   =   1.464100----------  
  count2   2   if   n   =   0  
  count2   3   if   n   =   1  
  count2   4   if   n   =   2  
  count2   5   if   n   =   4  
  count2   6   if   n   =   8  
  count2   7   if   n   =   0  
  count2   8   if   n   =   1  
  count2   9   if   n   =   2  
  count2   10   if   n   =   4  
  count2   11   if   n   =   8  
  ----------foo2(1.1,8)   =   2.143589----------  
  count3   5   if   n   =   0  
  count3   6   if   n   =   2  
  count3   7   if   n   =   8  
  count3   11   if   n   =   0  
  count3   12   if   n   =   2  
  count3   13   if   n   =   8  
  ----------foo3(1.1,8)   =   2.143589----------  
  count2   3   if   n   =   0  
  count2   4   if   n   =   1  
  count2   5   if   n   =   3  
  count2   6   if   n   =   6  
  count2   8   if   n   =   0  
  count2   9   if   n   =   1  
  count2   10   if   n   =   3  
  count2   11   if   n   =   6  
  ----------foo2(1.1,6)   =   1.771561----------  
  count3   3   if   n   =   0  
  count3   4   if   n   =   2  
  count3   5   if   n   =   6  
  count3   7   if   n   =   0  
  count3   8   if   n   =   2  
  count3   9   if   n   =   6  
  ----------foo3(1.1,6)   =   1.771561----------  
  count2   3   if   n   =   0  
  count2   4   if   n   =   1  
  count2   5   if   n   =   3  
  count2   6   if   n   =   6  
  count2   7   if   n   =   12  
  count2   9   if   n   =   0  
  count2   10   if   n   =   1  
  count2   11   if   n   =   3  
  count2   12   if   n   =   6  
  count2   13   if   n   =   12  
  ----------foo2(1.1,12)   =   3.138428----------  
  count3   3   if   n   =   0  
  count3   4   if   n   =   1  
  count3   5   if   n   =   4  
  count3   6   if   n   =   12  
  count3   8   if   n   =   0  
  count3   9   if   n   =   1  
  count3   10   if   n   =   4  
  count3   11   if   n   =   12  
  ----------foo3(1.1,12)   =   3.138428----------  
  count2   4   if   n   =   0  
  count2   5   if   n   =   1  
  count2   6   if   n   =   3  
  count2   7   if   n   =   7  
  count2   10   if   n   =   0  
  count2   11   if   n   =   1  
  count2   12   if   n   =   3  
  count2   13   if   n   =   7  
  ----------foo2(1.1,7)   =   1.948717----------  
  count3   4   if   n   =   0  
  count3   5   if   n   =   2  
  count3   6   if   n   =   7  
  count3   9   if   n   =   0  
  count3   10   if   n   =   2  
  count3   11   if   n   =   7  
  ----------foo3(1.1,7)   =   1.948717----------  
  count2   4   if   n   =   0  
  count2   5   if   n   =   1  
  count2   6   if   n   =   3  
  count2   7   if   n   =   7  
  count2   8   if   n   =   14  
  count2   11   if   n   =   0  
  count2   12   if   n   =   1  
  count2   13   if   n   =   3  
  count2   14   if   n   =   7  
  count2   15   if   n   =   14  
  ----------foo2(1.1,14)   =   3.797498----------  
  count3   5   if   n   =   0  
  count3   6   if   n   =   1  
  count3   7   if   n   =   4  
  count3   8   if   n   =   14  
  count3   12   if   n   =   0  
  count3   13   if   n   =   1  
  count3   14   if   n   =   4  
  count3   15   if   n   =   14  
  ----------foo3(1.1,14)   =   3.797498----------  
   
   
  Terminated   with   return   code   0  
  Press   any   key   to   continue   ...  
   
   
  ===============  
   
  如果这样考虑,三分法   并不比   两分   吃亏   (单从乘法考虑)  
   
  不过,我统计的方法可能不对  
   
  若干年后再看这个问题,可能我自己会觉得比较傻~  
  Top

37 楼enderjiang()回复于 2006-10-25 13:58:06 得分 0

markTop

38 楼davecom(IT新人)回复于 2006-10-25 19:53:52 得分 0

AAAAAAAAAAAAAAAAAAAAAAA       函数的递归调用,没问题!!!!!!!Top

39 楼zhongdu(中毒)回复于 2006-10-25 20:53:28 得分 0

markTop

40 楼windnum1(非宁静无以致远)回复于 2006-10-28 10:53:48 得分 0

夷,   天上会不会掉分呢?Top

41 楼gjb999(老鼠老鼠还是一只老鼠!)回复于 2006-10-28 20:30:19 得分 0

夷,   天上掉分会砸到你吗?Top

42 楼dfsong(dandan)回复于 2006-10-29 09:58:23 得分 0

x^n,   so   easyTop

43 楼lsd1025()回复于 2006-10-29 14:46:07 得分 0

(a)  
  看了后完全赞同Kusk说法,他的讲解个人认为很正确Top

相关问题

关键词

得分解答快速导航

  • 帖主:eimhee

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo