Ackermann 函数的递归结构真是蛮有意思的,适合用来练手递归思想。函数本身看起来简单,只有三个分支,但一旦参数上了点规模,计算量立马爆炸,挺考验语言性能和堆栈深度的。如果你在学习递归、想深挖函数调用机制,或者单纯想挑战一下极限,这个例子还挺合适的。

Ackermann 函数的Matlab 实现也有,虽然 Matlab 在堆栈上不如其他语言灵活,但也能跑出结果。对比一下不同语言的方式,对理解递归有。

你还可以看看over 函数怎么做递归汇总,思路和 Ackermann 有点异曲同工。另外,MATLAB 里的嵌套递归讲得也还不错,细节比较全,适合初学者。

推荐你手动敲一遍这个函数:

function A = Ackermann(m, n)
  if m == 0
    A = n + 1;
  elseif n == 0
    A = Ackermann(m - 1, 1);
  else
    A = Ackermann(m - 1, Ackermann(m, n - 1));
  end
end

嗯,要注意堆栈溢出的问题,运行的时候别一上来就试A(4, 2),容易直接卡死。一步步试,像A(2, 3)A(3, 2)这样,观察一下增长速度,会有点震撼。

如果你喜欢挑战极限递归,又不怕程序卡死,那这个函数还蛮适合你的。