请问这道算法题怎么解?

BlueprintIrene 2005-10-21 04:55:55
Ackermann's function A(m,n) is defined as follows:

--- n + 1 , if m = 0
|
A(m, n) = -|-- A(m - 1, 1) , if n = 0
|
--- A(m - 1, A(m, n - 1)) , otherwise

This function is studied because it grows very fast for small values of m and n. Write a nonrecursive algorithm for computing Ackermann's function.

Please implement the algorithm by using C/C++, thank you!
...全文
385 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2005-10-22
  • 打赏
  • 举报
回复
呵呵 推导过

f(4,y)时, 基本上用long数据类型就已经存储不下了.
xiaocai0001 2005-10-22
  • 打赏
  • 举报
回复
问题同下面几个帖子

http://community.csdn.net/Expert/topic/4258/4258068.xml?temp=.4705469
http://community.csdn.net/Expert/topic/4286/4286981.xml?temp=.8409998
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int m,n,i;
long x;


while( scanf("%d %d",&m,&n)!=EOF ){
if( m==1 ) x=2+n;
else if( m==2 ) x=3+2*n;
if( m==3 )
for(i=0,x=1;i<=n;i++)
x=x*2+3;
printf("%ld\n",x);
}
return 0;
}


对不对呀
fflush 2005-10-21
  • 打赏
  • 举报
回复
没有从数学上入手,直接从函数定义写的非递归版本
#include <stack>

using namespace std;

int akm_nr (int m , int n)
{
stack<int> s;

s.push (m);

while (! s.empty ())
{
m = s.top ();
s.pop ();

if (m == 0)
n = n + 1;
else
{
s.push (m - 1);
if (n == 0)
{
n = 1;
}
else
{
s.push (m);
n = n - 1;
}
}
}

return n;
}
fuyong214 2005-10-21
  • 打赏
  • 举报
回复
int A(int m,int n)
{
if (m==0) return (n+1);
if (n==0) return A(m - 1, 1);
return A(m - 1, A(m, n - 1));
}
qhfu 2005-10-21
  • 打赏
  • 举报
回复
Ackermann应该是一个德国人,
Ackermann函数是可计算性理论里面的一个比较出名的函数,,属于非原始递归函数,增长速度极快。在形式语义学和可计算性理论的课上出现过,都是一些很抽象的东西,计算机科学中比较基础的东西吧,不过近年来研究这方面的人好像极少,主要是欧洲人在做这些研究吧。我也只是知道一些名词, 里面具体的东西 根本看不懂。
wangjing1228 2005-10-21
  • 打赏
  • 举报
回复
但是想问一下高手:Ackermann是什么?
wangjing1228 2005-10-21
  • 打赏
  • 举报
回复
mmmcd给的连接有很酷的解法
qhfu 2005-10-21
  • 打赏
  • 举报
回复
楼主去文献数据库找一下吧,应该能找到相关的文章! 这个我也没有做过, 提供不出来,只是知道这情况。 :)
BlueprintIrene 2005-10-21
  • 打赏
  • 举报
回复
to qhfu(崩溃) :

不要用递归做,有代替的表达式。 关键问题是表示一个大数,如果是用java的话有类,用c++要自己写

===================================================================================

这个代替的表达式是什么?
mmmcd 2005-10-21
  • 打赏
  • 举报
回复
http://mathworld.wolfram.com/AckermannFunction.html
caigp 2005-10-21
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int m,n,i;
long x;


while( scanf("%d %d",&m,&n)!=EOF ){
if( m==1 ) x=2+n;
else if( m==2 ) x=3+2*n;
if( m==3 )
for(i=0,x=1;i<=n;i++)
x=x*2+3;
printf("%ld\n",x);
}
return 0;
}

zhouxuyang 2005-10-21
  • 打赏
  • 举报
回复
int A (int m,int n)
{
if(m == 0) return n+1;
if(n == 0) return A(m - 1, 1);
return A(m - 1, A(m, n - 1));
}

按照这道题目的意思,这个递归调用唯一的出口应该是m == 0的情况吧,所以首先考虑这个情况,否则没完没了了
qhfu 2005-10-21
  • 打赏
  • 举报
回复
Ackermann 函数 ,, 4,2就很难算, 4,3基本上算不出来。
不要用递归做,有代替的表达式。 关键问题是表示一个大数,如果是用java的话有类,用c++要自己写一个表示大数的容器或类。
还有就是不要尝试计算4,3 以上。 基本上是一个直线上升的函数。
我没有实现代码,也没有实现过,不过我同学实现过, 用P4 2.8 1G内存。用了不到十分钟计算出 4,2 结果好像65533位。
v41dugu 2005-10-21
  • 打赏
  • 举报
回复
英文的。。。好厉害。。

64,648

社区成员

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

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