Haskell: версия хвостовой рекурсии глубины бинарного дерева
Во-первых, у меня есть две разные реализации, которые я считаю правильными, и я их профилировал и думал, что они примерно одинаковой производительности:
depth::Tree a -> Int
depth Empty = 0
depth (Branch b l r) = 1 + max (depth l) (depth r)
depthTailRec::Tree a -> Int
depthTailRec = depthTR 0 where
depthTR d Empty = d
depthTR d (Branch b l r) = let dl = depthTR (d+1) l; dr = depthTR (d+1) r in max dl dr
Мне просто интересно, разве люди не говорят о том, как хвостовая рекурсия может быть полезна для производительности? И много вопросов прыгает в мою голову:
Как вы можете сделать функцию глубины быстрее?Я читал кое-что о том, как лень Хаскелла может уменьшить необходимость рекурсии хвоста, это правда?Правда ли, что каждая рекурсия может быть преобразована в хвостовую рекурсию?Наконец, хвостовая рекурсия может быть быстрее и экономить место, потому что она может быть превращена в петли и, таким образом, уменьшить необходимость толкать и выталкивать стек, правильно ли я понимаю?