c++入门经典上的习题,找不到答案了,请问overflow

wosk 2004-11-21 01:39:04
递归函数Ackerman

#include<iostream>
using namespace std;

int Ackerman(int a,int b);

int main(int argc, char* argv[])
{
int a=0,
b=0;

cout<<"Please input two integer(>=0): ";
cin>>a>>b;
cout<<Ackerman(a,b)<<endl;
return 0;
}

int Ackerman(int a,int b)
{
if(a>=0 && b>=0)
{
if(a==0)
return b+1;
else if(b==0 && a>0)
return Ackerman(a-1,1);
else
return Ackerman(a-1,Ackerman(a,b-1));
}
else
return -1;
}
当输入为4 1时就出现overflow的错,请问是怎么回事,谢谢
...全文
585 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wosk 2004-12-01
  • 打赏
  • 举报
回复
ggjjmen 帮帮忙啊

想要处理这样的大数该怎么办啊

谢谢
wosk 2004-11-27
  • 打赏
  • 举报
回复
嘿嘿,问个初级的问题,(“4,2)实在太大了,相当于(2,65536)”它都超出double的范围了,怎么求啊,谢谢
kmissu14 2004-11-26
  • 打赏
  • 举报
回复
格式太不规整了, 人都看晕了。
wosk 2004-11-26
  • 打赏
  • 举报
回复
谢谢各位
但是不改int Ackerman(int a,int b)
能解决问题吗
3x again!
eduhf_123 2004-11-23
  • 打赏
  • 举报
回复
int Ackerman(int a,int b)
{
if(b>=0)
{
if(a < 0) return -1 ;
else if(a == 0) return b+1 ;
else if(a == 1) return b+2 ;
else if(a == 2) return 2*b+3 ;
else if(a == 3) return power(2,b+3) - 3;
else if(a == 4) return b==0 ? 13 : power( 2 ,Ackerman(4,b-1)+3 ) - 3 ;
else return Ackerman( a-1,Ackerman(a,b-1) );
}
else
return -1;
}
Kendiv 2004-11-23
  • 打赏
  • 举报
回复
递归层次太深,程序会陷入递归无法返回,Ackerman函数的递归返回条件有问题。
eduhf_123 2004-11-22
  • 打赏
  • 举报
回复
但是自己多计算一些退出条件可以大大减少堆栈的占用:
Ackerman(0,b) = b+1 ;
Ackerman(1,b) = b+2 ;
Ackerman(2,b) = 2*b+3 ;
Ackerman(3,b) = 2^(b+3)-3 ;
Ackerman(4,b) = 2^(Ackerman(4,b-1)+3)-3 ;(Ackerman(4,0) = 13)
以上均要求b>=0,在加上以上的这些退出条件后,程序对堆栈的需求应该会大大降低。
eduhf_123 2004-11-22
  • 打赏
  • 举报
回复
Ackerman( 1, 0 )
=Ackerman( 0, 1 ) /*if(b==0 && a>0)return Ackerman(a-1,1)*/
=1+1 /*if(a==0)return b+1;*/
=2
所以没有缺少退出条件。
leolein 2004-11-22
  • 打赏
  • 举报
回复
少了一个退出条件
Ackerman( 1, 0 ) = 2;
yhp1972 2004-11-22
  • 打赏
  • 举报
回复
递归层数太多
caozl127 2004-11-22
  • 打赏
  • 举报
回复
程序没有问题,就是要运行好长时间
应该是递归层数太多所致
跟踪一下就全清楚了
wosk 2004-11-22
  • 打赏
  • 举报
回复
wxu2(蓝鸟),starlights(星光):
条件应该没有问题的,Ackerman函数的定义本来就是这个样子的

wentiboy(与人):
为什么要加else if(a==2) return 2*b+3;
不能解决问题吧,如果算的数大了怎么办呢

y8t47h(歪八) :
怎么设置栈的大小呢

还有我拿着《c++入门经典》初学,照着书上画瓢
书说网上有答案的,结果wrox网站上就没有这本书
了,郁闷,哪位gg有,谢过!

fcf128 2004-11-21
  • 打赏
  • 举报
回复
return Ackerman(a-1,Ackerman(a,b-1));

// 无语。。。 (有必要吗?)
oyljerry 2004-11-21
  • 打赏
  • 举报
回复
堆栈溢出了
starlights 2004-11-21
  • 打赏
  • 举报
回复
可能不是什么实际的建议,只是提一下:)不知道这个程序要实现什么功能,开始以为是将a+b打出来,但后来发现根本不是那么回事^^同意楼上,递归层次太多了,为了实现比较或者其他什么的有必要让小生看得头昏眼花么?还有判断的条件是不是太严整一点,可以查一查是不是格式的问题。
aa1298 2004-11-21
  • 打赏
  • 举报
回复
是无限循环。
Andy84920 2004-11-21
  • 打赏
  • 举报
回复
to y8t47h(歪八) :
堆栈如何设置大小?如dev-c++,gcc 等.
kevin_start 2004-11-21
  • 打赏
  • 举报
回复
应该是无限循环。
wxu2 2004-11-21
  • 打赏
  • 举报
回复
堆栈溢出,递归层次过多,可能出现无限递归,自己跟踪一下。
y8t47h 2004-11-21
  • 打赏
  • 举报
回复
把堆栈设置大些
加载更多回复(1)

64,281

社区成员

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

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