我在一本算法书中读到 Ackermann 函数不能进行尾递归(他们说的是“它不能转换为迭代”)。我对此很困惑,所以我尝试了这个:
let Ackb m n =
let rec rAck cont m n =
match (m, n) with
| 0, n -> cont (n+1)
| m, 0 -> rAck cont (m-1) 1
| m, n -> rAck (fun x -> rAck cont (m-1) x) m (n-1)
in rAck (fun x -> x) m n
;;
(这是 OCaml / F# 代码)。
我的问题是,我不确定这实际上是尾递归。你能确认是吗?如果不是,为什么?最后,当人们说阿克曼函数不是原始递归时,这是什么意思?
谢谢!