2012-12-18 12 views
8

Zum Beispiel, da die folgende Funktion keinen Akkumulator haben, ist es immer noch tail rekursiv?Benötigt Tail Recursion unbedingt einen Akku?

belong:: (Ord a) => a -> [a] -> Bool 
belong a [] = False 
belong a (h:t) 
    | a == h = True 
    | otherwise = belong a t 

Alle die Berechnungen in der Funktion vor dem rekursiven Aufruf verarbeitet werden, ist es eine hinreichende Bedingung Schwanz rekursiv zu betrachten?

+1

ja, es ist ausreichend – m09

+0

Tail Rekursion ist in strengen Sprachen am besten, aber in Haskell sind die Dinge ein wenig anders. [Diese Frage] (http://stackoverflow.com/questions/13042353/does-haskell-have-tail-recursive-optimization) liefert gute Informationen zu diesem Thema. – AndrewC

Antwort

10

Tail Rekursion benötigt nicht unbedingt einen Akkumulator. Akkumulatoren werden bei der Tail-Rekursion verwendet, um ein partielles Ergebnis durch die rekursive Aufrufkette zu übermitteln, ohne dass auf jeder Ebene der Rekursion zusätzlicher Platz benötigt wird. Zum Beispiel benötigt die rekursive faktorielle Funktion des kanonischen Tails einen Akkumulator, um das bis dahin aufgebaute Partialprodukt zu propagieren. Wenn Sie jedoch keine Informationen von einem rekursiven Aufruf an seinen Unterpunkt weiterleiten müssen, ist der Akkumulator nicht erforderlich.

Die von Ihnen bereitgestellte Funktion ist zwar tail rekursiv, benötigt aber keinen Akkumulator. Bei der Suche nach einem Element in einer Liste muss sich die Rekursion nicht daran erinnern, dass alle Elemente, die sie bisher betrachtet hat, nicht mit dem bestimmten Element übereinstimmen, nach dem gesucht wird. Es muss nur wissen, welches Element zu suchen ist und welche Liste zu suchen ist.

Hoffe, das hilft!

+0

Hat viel geholfen! Schöne Erklärung. – user1493813

0

Tail recursion braucht nicht unbedingt einen Akku. Ein Akkumulator wird jedoch häufig verwendet. Tipp, suche im Wikipedia-Artikel nach "Akku".