社区
新手乐园
帖子详情
新手问题:编写一个非递归函数计算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
打赏
收藏
新手问题:编写一个非递归函数计算Ackermann函数
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) 现在要求写一个非递归的函数,我一点思路都没有,这种问题应该从什么地方下手呢? 请高手指教? 还有递归的为什么有时候得不到结果? 谢谢 ^_^
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
递归的为什么有时候得不到结果?
可能的原因是:
算法写错了
结果太大或太小,溢出了
递归太深或者无限递归,栈溢出了。
递归子程序
计算
a
cke
rmann
函数
ACK(m,n)
试
编写
一段递归子程序
计算
a
cke
rmann
函数
ACK(m,n)。对于m≥0和n≥0的ACK(m,n)
函数
定义如下: ACK(0,n)=n+1 ACK(m,0)=ACK(m-1,1) ACK(m,n)=ACK(m-1,ACK(m,n-1)) 程序要求: ⑴ m、n在主程序从键盘输入,输入错误显示...
a
cke
rmann
函数
的递归实现和
非递归
实现
ackman
函数
的递归和
非递归
,学习数据结构的素材,
非递归
是使用堆栈实现的。
A
cke
rmann
函数
的
非递归
算法
function of a
cke
rmann
递归实例操作 a
cke
rmann
函数
数据结构 递归实例操作 a
cke
rmann
函数
A
cke
rmann
递归与
非递归
两种解法
A
cke
rmann
函数
的递归与
非递归
解法 为Visual C++ 6.0工程 有测试
函数
新手乐园
33,311
社区成员
41,784
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章