У меня есть следующие реализации для бинарного дерева и функции глубины, чтобы вычислить его глубину:OCaml глубина бинарного дерева, без переполнения стека
type 'a btree =
| Empty
| Node of 'a * 'a btree * 'a btree;;
let rec depth t = match t with
| Empty -> 0
| Node (_, t1, t2) -> 1 + Int.max (depth t1) (depth t2)
Проблема здесь состоит в том, что «глубина» является рекурсивной и может вызвать переполнение стека, когда дерево слишком велико.
Я прочитал о рекурсии хвоста и о том, как его можно оптимизировать в цикле while компилятором, чтобы удалить вызов стека.
Как бы вы сделали эту функцию хвостом рекурсивной или вместо этого использовали цикл while/for?
Преобразуя это в хвосте рекурсивный или итеративный алгоритм потребует использования явного стека. Это настоящая проблема или просто упражнение? Потому что в реальных приложениях вы либо убедитесь, что дерево сбалансировано, поэтому рекурсия не слишком глубокая или хранит глубину в узлах при их создании. –
Спасибо за подсказку для приложений реального мира. Это было упражнение. –
Возможная публикация: http://stackoverflow.com/questions/9323036/tail-recursive-function-to-find-depth-of-a-tree-in-ocaml – Kakadu