Haskell: wersja rekursji głębi drzewa binarnego
Przede wszystkim mam dwie różne implementacje, które moim zdaniem są poprawne, i wyprofilowałem je i myślę, że dotyczą one tej samej wydajności:
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
Zastanawiałem się tylko, czy ludzie nie mówią o tym, jak rekursja ogona może być korzystna dla wydajności? I wiele pytań wskakuje mi do głowy:
Jak można sprawić, aby głębokość działała szybciej?Czytałem o czymś, jak lenistwo Haskella może zmniejszyć potrzebę rekurencji ogonowej, czy to prawda?Czy to prawda, że każda rekurencja może zostać przekształcona w rekursję ogonową?Wreszcie rekursja ogonowa może być szybsza i wydajniejsza, ponieważ można ją przekształcić w pętle, a tym samym zmniejszyć potrzebę pchania i wyrzucania stosu, czy mam rację?