新手问题:编写一个非递归函数计算Ackermann函数

HebeStar 2005-09-22 02:47:42
Ackermann函数定义如下:
A(0,n)= n+1 对n>=0
A(m,0)= A(m-1,1) 对m>0
A(m,n)=A(m-1,A(m,n-1)) 对m>0且n>0

递归函数我会写 但是写出来有的参数带进去得不到结果比如A(4,2)
现在要求写一个非递归的函数,我一点思路都没有,这种问题应该从什么地方下手呢?
请高手指教? 还有递归的为什么有时候得不到结果? 谢谢 ^_^
...全文
470 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
HebeStar 2005-09-23
  • 打赏
  • 举报
回复
先把帖结了再慢慢消化 多谢各位了 ^_^
晨星 2005-09-22
  • 打赏
  • 举报
回复
哦,原来如彼。那me也只是随便说说。。。
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
me是宾格,不能做主语
--------
中国式英语,没有什么限制的~~
想怎么说就怎么说

不过我听人说过
在英语中如果用me做主语则表示说话人对自己是相当的自信的~~~
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
晕~~~~~

再晕~~~

倒~~~~~

自杀去~
晨星 2005-09-22
  • 打赏
  • 举报
回复
me是宾格,不能做主语;intent通常是名词,做形容词是指“专心的”;“故意”是intend,形容词是intended。。。
兄弟还是讲中文吧。-_-
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
嘿嘿~~~

me 是 intent 的
晨星 2005-09-22
  • 打赏
  • 举报
回复
是信誉,不是性欲。。。。。
LoveYouJustOneDay 2005-09-22
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstdlib>

using namespace std;

long ackman(long m, long n);

int main(int argc, char *argv[])
{
long m, n;
cin>>m>>n;
cout<<ackman(m, n);
system("PAUSE");
return 0;
}

long ackman(long m, long n)
{
long stack[10000];
int pos=1;
stack[0]=m; stack[1]=n;
while(pos)
{
n=stack[pos--];
m=stack[pos];
if(m==0) stack[pos]=n+1;
if(m!=0 && n==0)
{
stack[pos++]=m-1;
stack[pos]=1;
}
if(m!=0 && n!=0)
{
stack[pos++]=m-1;
stack[pos++]=m;
stack[pos]=n-1;
}
}
return stack[0];
}
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
哇~,删一个回帖减2点性欲啊!!!
晨星 2005-09-22
  • 打赏
  • 举报
回复
佩服一把。。。
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
就是从递推式中得到的
先计算
A(0, n) = n + 1 ................. (1)
A(1,n) = A(0,A(1,n-1)) = A(1, n-1) + 1 = A(0, A(1, n-2)) + 1 = ......=
= A(1,0) + n = A(0,1) + n = 1+1+n
所以 A(1,n) = n+2 ................. (2)

A(2,n) = A(1, A(2,n-1)) = A(2,n-1) + 2 = ... = A(2,0) + 2*n
= A(1,1) + 2*n = 1+2 + 2*n = 2n+3

A(2,n) = 2n + 3 .................(3)

以此类推,往下计算
A(3,n) = 2^(n+3) - 3 ...........(4)

A(4,n)的复杂了些,没写了

A(4,1) = 65533
A(4,2) = A(3,A(4,1)) = 2^(A(4,1) + 3) - 3 = 2^65536 - 3
HebeStar 2005-09-22
  • 打赏
  • 举报
回复
To:xiaocai0001(萧筱雨)
(4,1) = 65533
A(4,2) = 2^65536 - 1
C/C++的内部数据类型没有一个能够放下这个数的
所以是出不了结果的
-------------------------------------------------
请教一下这个结果是怎么得来的,从函数定义中我什么规律也找不到,应该怎么样去思考啊?
谢谢 ^_^
晨星 2005-09-22
  • 打赏
  • 举报
回复
一时糊涂,想错了,删除了。:P
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
2^65536 - 3
真的是这个数
不过这个数用10进制表示是一个接近2万位的数
没你想像的那么大~~
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
更正一下
A(4,2) = 2^65536 - 3

如果是想学习 递归算法改非递归算法

那就另当别论了~~~~~
xiaocai0001 2005-09-22
  • 打赏
  • 举报
回复
是不是上次问的那个
告诉你为什么递归出不了A(4,2)

我实际计算了一下
A(4,1) = 65533
A(4,2) = 2^65536 - 1
C/C++的内部数据类型没有一个能够放下这个数的
所以是出不了结果的

改成非递归的同样没什么意义
晨星 2005-09-22
  • 打赏
  • 举报
回复
递归的为什么有时候得不到结果?
可能的原因是:
算法写错了
结果太大或太小,溢出了
递归太深或者无限递归,栈溢出了。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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