关于递归次数的问题

delphiwcdj 2010-10-28 08:49:48
问题:在写一个计算模幂运算的算法时,发现两种不同的递归方法能够递归的次数大不相同。代码1的方法在4624次的时候(即,b取4624时)就会发生栈溢出;而代码2可以递归的次数远远大于这个。请问可以递归的次数和什么因素相关呢?
代码是计算:a的b次方再模c,即a**b%c,**代表幂。

分数不多,请见谅!谢谢!
代码1:

#include <cstdio>
#include <cassert>

// calculate a**b%c
int fun(int a, int b, int c)
{
assert(a && (b>=0) && c);
static int itime=0;
if (++itime%1000==0)// 每递归1000次时打印
{
printf("%d\n",itime);
}

if (0==b)
{
return 1;
}
else
{
return fun(a, b-1, c)*a%c;
}
}

int main()
{
int a, b, c;
while (3==scanf("%d%d%d",&a,&b,&c))
{
printf("%d\n",fun(a,b,c));
}

return 0;
}

代码2:

#include <cstdio>
#include <ctime>
#include <cassert>

// calculate a**b%c
int fun(int a, __int64 b, int c)
{
assert(a && (b>=0) && c);

static int itime=0;
if (++itime%100000000==0)// 每递归1亿次时打印
{
printf("%d\n",itime);
}

if (0==b)
{
return 1;
}
else
{
return (1==(b&1)) ? a*fun(a, b-1, c)%c : fun(a, b/2, c)*fun(a, b/2, c)%c;
}
}

int main()
{
int a, c;
__int64 b;
clock_t beg,end;
while (3==scanf("%d%I64d%d",&a,&b,&c))
{
beg=clock();
printf("%d\n",fun(a,b,c));
end=clock();
printf("time used: %.2lf\n",double(end-beg)/CLOCKS_PER_SEC);
}

return 0;
}
...全文
155 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphiwcdj 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gameboy2 的回复:]

lz没说明溢出的原因 数字溢出?
[/Quote]
stack溢出
gameboy2 2010-10-28
  • 打赏
  • 举报
回复
lz没说明溢出的原因 数字溢出?
gameboy2 2010-10-28
  • 打赏
  • 举报
回复
递归的次数怎么这么大
delphiwcdj 2010-10-28
  • 打赏
  • 举报
回复
搞定了 谢谢!
onedayhero 2010-10-28
  • 打赏
  • 举报
回复
ls各位看清楚,lz的问题是:在递归函数的开始用静态变量累计递归调用次数
方法1当递归调用次数达到4624时就发生了栈溢出,但方法二的递归调用次数远远超过了这个值而没有发生溢出
这是为什么?
plyj0123 2010-10-28
  • 打赏
  • 举报
回复
递归的次数是跟递归结束的条件有关,就是两种方法的条件不同,当然递归的次数就不同喽
gules 2010-10-28
  • 打赏
  • 举报
回复
楼主,这是两种完全不同的算法:
第一种,相当于a*(a*(a*……(a*a))),需要计算b次乘法,也就是要递归b次(重复计算太多);
第二咱,相当于a^(b/2)*a^(b/2),需要计算Lgb次乘法,也就是需要递归2Lgb次;
由于2Lgb远小于b(b较大时),所以第二种能递归的次数更多。
delphiwcdj 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lthyxy 的回复:]

if (0==b)
{
return 1;
}
[/Quote]
???
liutengfeigo 2010-10-28
  • 打赏
  • 举报
回复
if (0==b)
{
return 1;
}

64,637

社区成员

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

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