Прежде всего, у меня есть две разные реализации, которые, я считаю, верны, и они профилировали их и думали, что они имеют одинаковую производительность:
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
Мне просто интересно, разве люди не говорят о том, как хвостовая рекурсия может быть полезной для производительности? И в голову вскакивает много вопросов:
- Как вы можете сделать функцию глубины быстрее?
- Я читал о чем-то о том, как ленивость Haskell может уменьшить потребность в рекурсии хвоста, верно ли это?
- Правда ли, что каждая рекурсия может быть преобразована в хвостовую рекурсию?
- Окончательная рекурсия хвоста может быть более быстрой и эффективной по пространству, потому что ее можно превратить в циклы и, таким образом, уменьшить необходимость нажимать и выталкивать стек, правильно ли я понимаю?