Ackermann函数

2021-02-20 17:23

如果有人不知道Ackermann函数定义为如下:So i我正在尝试编写一个能够计算它的代码,但我似乎无法理解它。

解答动态

  • 这里有一个使用bigintcalc-package的基于罗马数字扩展的解决方案。
    请注意:递归定义Ackermann函数意味着嵌套调用\RomanNumeric,这会对语义嵌套造成影响。
    对于egreg的解决方案,wipet和Marcel Krüger没有这个问题。
    \documentclass{article}\usepackage{amath}\usepackage{bigintcalc}\newcommand\UDfirstoftwo[2]{1}%\newcommand\UDsecondoftwo[2]{2}%\newcommand\UDPassFirstToSecond[2]{2{1}%\csname@ifdefinable\endcsname\udstopRoman{\chardef\udstopRoman=`^00}%%\阿克曼{m}{n}\newcommand\Ackermann{%\romannumeric\Ackermannloop}%\newcommand\Ackermannloop[2]{%\ifnum\bigintcalcCmp{1}{0}=0\expandafter\UDfirstoftwo\else\expandafter\UDsecondoftwo\fi{\expandafter\expandafter\expandafter\udstopmanumeric\bigintcalcCmp{2}}{0}=0\expandafter\UDfirstoftwo\else\expandafter\UDsecondoftwo\fi{%\expandafter\expandafter\Ackermannloop\expandafter\expandafter\expandafter{\bigintcalcDec{1}}{1}}}%{%\expandafter\UDPassFirstToSecond\expandafter{%\romannumeric\expandafter\expandafter\UDPassFirstToSecond\2010年3\\膨胀后\\\膨胀后\膨胀后{{{{{埃尔曼}(2,0(0,1)=\Ackermann{{2{{2}{{{2}{{2}{{2}{{{{{{{{}{{}$\text{Ackermann}(3,3)=\Ackermann{3}{3}$\text{Ackermann}(3,4) =\Ackermann{3}{4}$%\Ackermann{4}{2}%我想上面的结果是:%!超过TeX容量,抱歉[input stack size=5000]。\end{document}
    } 这里有一个使用经典TeX工具的解决方案(没有expl3)。
    \def\afterfi#1#2\fi{\fi#1}\def\Ac#1#2{\ifnum 1=0\afterfi{\the\numexpr#2+1\relax}%\else\afterfi{\ifnum#2=0\afterfi{\Aeval{1-1}%\else\在fi{\Aeval{{1-1}{{{1-1}{{{{1-1}}}{{{{;2}$\par}\A(0,0)\A(1,0)\A(2,0)\A(0,1)\A(0,2)\A(1,1)\A(2,2)\A(2,3)\A(3,3)\A(3,4) 使用\bye afterfi宏是为了节省TeX stack.

    • 非常简单:只需实现递归定义。
      \documentclass{article}\ExplSyntaxOn\NewExpandableDocumentCommand{\ackermann}{mm}{\needle_阿克曼:嗯{1}{2}}\cs_新:Nn\针_阿克曼:嗯{\n内景_比较:nTF{1=0}{%m=0\int_评估:n{ #2 + 1 }}{%mgt;0\针_阿克曼:ee{\n内景_评估:n{1-1}}{\int_评估:n{\针_阿克曼:ee{1}{\int_评估:n{2-1}}}\cs\u生成_变量:Nn\针_阿克曼:嗯{ee}\ExplSyntaxOff\begin{document}$A(0,0)=\ackermann{0}{0}

      • End

      免责声明:

      本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。