阿克曼函数

2012年5月25日

20世纪20年代,威廉·阿克曼(Wilhelm Ackermann)演示了一种非原始递归的可计算函数,解决了计算理论发展过程中的一个重要争论。他的函数有几个版本,其中最常见的是

A(m,n)=\left\{begin{array}{ll}n+1和\mbox{if\(m=0\)}\\A(m-1,1)和\mbax{if\。

在非负整数上定义n个。即使是非常小的输入,函数也会快速增长;例如,A(4,2)是大约20000位的整数。

您的任务是实现Ackermann的功能。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

10对“阿克曼函数”的回应

  1. 考虑到这个函数的递归性很强,我选择了Haskell而不是Python:

    a::整数->整数->整数a 0 n=n+1a m 0=a(m-1)1a m n=a(m-1)$a m(n-1)主::IO()main=打印$a 3 4
  2. […]编程新闻:阿克曼函数在20世纪20年代,威廉·阿克曼演示了一种非原语递归的可计算函数,解决了计算理论预备阶段的一个重要论点。阅读完整故事=>编程实践[…]

  3. 杀人
    定义a(m,n)如果m==0n+1elsif m>0&&n==0a(m-1,1)其他的a(m-1,a(m,n-1))结束结束放置“ackerman 3,4={a(3,4)}”
  4. 剪脚趾的人

    请随意嘲笑我。我试着用可视化C#来实现这一点。堆栈溢出或存在一些任意的堆栈限制,而visual C#凭借其无限的智慧决定了我不知道自己在做什么。有趣的时光

  5. 编程实践

    Toucter:如果你的语言没有提供足够的堆栈,你必须创建自己的堆栈;这就是练习的重点。A(4,1)=65533应该在函数的范围内。

  6. 伊帕因

    哈!阿克曼函数。至少这可以用python计算A(4,2)


    定义ackermann(m,n):
    当m>=4时:
    如果n==0:
    n=1
    其他:
    n=阿克曼(m,n-1)
    m=米-1
    如果m==3:
    返回(1<<n+3)-3
    elif m==2:
    返回(n<<1)+3
    elif m==1:
    返回n+2
    其他:
    返回n+1

    打印ackermann(4,2)

    http://codepad.org/QdneSl1Q

  7. 函数A(m,n){返回(m==0)?n+1:(m>0&&n=0)?A(m-1,1):(m>0和n>0)?A(m-1,A(m,n-1)):未定义;}

    http://jsfiddle.net/vcKdF/3248/

  8. 伊戈里语

    来点q怎么样


    A: {[m;n]
    如果[m~0;:n+1];
    $[n~0;
    如果[0<m;
    :A[m-1;1]];
    如果[0<n;
    :A[m-1;A[m;n-1]]];
    };

  9. 基督教的

    我用Go lang编写的解决方案:https://gist.github.com/2942073

  10. 大卫·戈特纳

    使用闭合形式,递归仅对m>=4的Ackerman(m,n)是必要的。

    定义超(n,a,b)如果n==0,则返回b+1如果n==1,则返回a+b如果n==2,则返回a*b如果n==3,则返回a**b如果b==0,则返回1x=a(b-1).次数|_|x=超(n-1,a,x)结束返回x结束定义ackerman(m,n)超(m,2,n+3)-3结束

留下评论