Я прочитал в алгоритмической книге, что функция Акермана не может быть сделана хвостовой рекурсивной (то, что они говорят, «она не может быть преобразована в итерацию»). Я очень запутать об этом, так что я попробовал и придумать с этим:Является ли эта реализация хвостовой рекурсивной?
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 # код).
Моя проблема в том, что я не уверен, что это на самом деле хвост рекурсивный. Не могли бы вы подтвердить, что это так? Если нет, то почему? И в конце концов, что это значит, когда люди говорят, что функция Аккермана не примитивна рекурсивна?
Спасибо!
Вы все еще создаете «стек» вызовов функций, когда вы проходите эту лямбду вокруг. –
Да, это хвост-рекурсивный. Вы можете скомпилировать файл с помощью ocamlopt с опцией '-dlinear'. Это должно помочь вам определить, использует ли ваша функция tail-calls. – nlucaroni