Haskell: Schwanzrekursionsversion der Tiefe des Binärbaums

Zuallererst habe ich zwei verschiedene Implementierungen, von denen ich glaube, dass sie korrekt sind, und ich habe sie profiliert und denke, dass sie ungefähr von der gleichen Leistung sind:

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 

Ich habe mich nur gefragt, ob die Leute nicht darüber reden, wie die Schwanzrekursion für die Leistung vorteilhaft sein kann. Und viele Fragen springen mir in den Kopf:

Wie können Sie die Tiefenfunktion beschleunigen?Ich habe etwas darüber gelesen, wie Haskells Faulheit die Notwendigkeit einer Schwanzrekursion verringern kann, stimmt das?Ist es die Wahrheit, dass jede Rekursion in eine Schwanzrekursion umgewandelt werden kann?Endlich kann die Schwanzrekursion schneller und platzsparender sein, da sie in Schleifen verwandelt werden kann und so die Notwendigkeit verringert, den Stapel zu verschieben und zu platzieren. Stimmt das?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage