这样的递归该如何理解?

yongzhi130 2007-05-12 08:31:00
long int pow(long int X,unsigned int N)
{
/*1*/ if(N==0)
/*2*/ return 1;
/*3*/ if(N==1)
/*4*/ return X;
/*5*/ if(IsEven(N))
/*6*/ return pow(X*X,N/2);
else
/*7*/ return pow(X*X,N/2)*X);
}

这是计算X的N次幂的算法,IsEven(N)是判断N是不是偶数的一个函数。
第七行还可以写成pow(X,N/2)*pow(X,N/2);
这样的递归是如何执行的??
若将第六行改成return pow(pow(X,2),N/2)或return pow(pow(X,N/2),2)将会产生一个死循环,为什么??
...全文
327 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-05-14
  • 打赏
  • 举报
回复
第六行(应该是6吧?) 写成 pow(X,N/2)*pow(X,N/2),
显然没有 pow(X*X,N/2) 效率高,
pow(X,N/2)*pow(X,N/2) 要重复执行一次 pow(X,N/2) 的递归,
而 pow(X*X,N/2) 只需要一次...

当递归层次比较深的时候,
pow(X,N/2)*pow(X,N/2) 方式更是不行 ...
jixingzhong 2007-05-14
  • 打赏
  • 举报
回复
如果写成pow(X,N/2)*pow(X,N/2),编译器是如何执行的?? //第七行?

先递归得到 pow(X,N/2);
然后重复进行一次递归得到 pow(X,N/2);
然后两者相乘。
jixingzhong 2007-05-14
  • 打赏
  • 举报
回复
若将第六行改成return pow(pow(X,2),N/2)或return pow(pow(X,N/2),2)

注意两种情况中都有一个 pow 参数恒为 2,
那么无论怎么递归,
总是无法满足递归终止条件 N==0 or N==1,
无限递归了 ...
longtramp 2007-05-14
  • 打赏
  • 举报
回复
mark
spofmy 2007-05-14
  • 打赏
  • 举报
回复
return pow(pow(X,N/2),2)

pow(?,2),参数2一直没变,肯定死循环!
yongzhi130 2007-05-13
  • 打赏
  • 举报
回复
如果写成pow(X,N/2)*pow(X,N/2),编译器是如何执行的??
ZhangYv 2007-05-13
  • 打赏
  • 举报
回复
递归是否停止取决于N的大小,return pow(pow(X,N/2),2)最外面一个pow 的参数固定为2,如果IsEven(N)不断执行else 的分支,那么就会一直递归下去停止不了。
believefym 2007-05-12
  • 打赏
  • 举报
回复
return pow(pow(X,N/2),2)

第二个pow(X,N/2),参数一直没变,肯定死循环,除非已开始N/2就是0或1才能return

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧