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)
这样,观察一下增长速度,会有点震撼。
如果你喜欢挑战极限递归,又不怕程序卡死,那这个函数还蛮适合你的。