pow(x,n) 递归与循环

litchgu 2017-07-26 03:33:32
double myPow(double x, long long n) 
{

double sum=1.0;

if(n==0)
{
return 1;
}
if(n>0)
{
while(n--)
{
sum*=x;
}
return sum;
}
if(n<0)
{
int m=-n;
while(m--)
{
sum*=x;
}
return 1/sum;
}

}

double mypow(double x,long long n)
{
if(n==0)
{
return 1;
}
if(n<0)
return 1/mypow(x,-n);
if(n%2==0)
{
return mypow(x,n>>1)*mypow(x,n>>1);
}
else
{
return mypow(x,n>>1)*mypow(x,n>>1)*x;
}
}
其中myPow为循环,mypow为递归。自己写的时候,用的是循环,但是提交的时候显示时间超时,就查了下百度,基本都是用递归的,我在vs2010的debug模式下测试了一下,在小于10的9次方时,循环比递归快了一点,但是10的9次方后递归反而快了。感觉很奇怪,一直感觉递归要比循环慢很多。为什么递归在pow中会比循环快?以下是测试的代码
int main(void)
{
clock_t start=clock();
double x=myPow(2.0,1000000000000);
clock_t end=clock();
double a=(double)(end-start)*1000/CLOCKS_PER_SEC;
}
...全文
332 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
codedoctor 2017-07-30
  • 打赏
  • 举报
回复
这个东西很好理解吧。。 首先,递归它用的是二分的程式,所以一直都是两个比较小数相乘,所以速度较快。(C语言的机制) 然后,你可以试着对你的循环进行改进,肯定也可以超过递归算法的。
rayw0ng 2017-07-29
  • 打赏
  • 举报
回复
递归因为参数出入栈的原因,一般都是比循环要慢的。 你这里递归快的原因是大于 0 的情况分了奇数和偶数,明显比循环的次数要少一半,所以才会快了一点。
赵4老师 2017-07-27
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and 无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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