2014-01-29 11 views
12

Ich versuche, den Unterschied zwischen diesen 2 rekursiven Strategien zu bekommen.Der Unterschied zwischen Kopf und Schwanz Rekursion

Die Definition wurde mir gesagt, ist die folgende:

Endrekursion: Ein Anruf ist Schwanz-rekursiv, wenn nichts getan werden muss, nachdem der Anruf zurückkehrt, dh, wenn der Aufruf zurückkehrt, wird der zurückgegebene Wert sofort zurückgegeben von der aufrufenden Funktion

Kopf Rekursion: Ein Aufruf ist kopfrekursiv, wenn die erste Anweisung der Funktion der rekursive Aufruf ist.

+1

"Kopf Rekursion" ist nicht etwas, von dem ich jemals zuvor gehört habe. Es klingt nicht nach einem nützlichen Konzept; Es ist extrem selten, dass ein rekursiver Aufruf das erste ist, was eine Funktion tut. Dies schließt jede Art von Bedingung aus, um zu bestimmen, ob der Aufruf und alle Argumente ausgeführt werden sollen, die vor dem Funktionsaufruf ausgewertet werden müssten. In einigen Sprachen ist dies sogar unmöglich, da die Funktion einen Ausdruck zur Laufzeit auswerten muss, um die Funktion zum rekursiven Aufruf zu bestimmen. – user2357112

+0

Google hat es gegoogelt. Sieht so aus, als ob die Quellen, die den Begriff verwenden, eine sehr lockere Definition von "Kopf" haben, grob gesprochen vor der "echten Arbeit". Ich bin nicht sicher, warum sie überhaupt "Kopfrekursion" definieren; Sie scheinen mit dem Konzept nirgendwohin zu gehen. Es ist definitiv nicht so nützlich wie Tail-Rekursion. – user2357112

+1

Zu unterscheiden zwischen Kopf Rekursion und allem, was nicht Schwanz Rekursion scheint redundant. – Sylwester

Antwort

22

In head recursion, der rekursive Aufruf, wenn es passiert, kommt vor anderen Verarbeitung in der Funktion (denke daran, dass es am oberen oder Kopf der Funktion passiert).

In tail recursion ist es das Gegenteil - die Verarbeitung erfolgt vor dem rekursiven Aufruf. Die Wahl zwischen zwei rekursiven Stilen mag willkürlich erscheinen, aber die Wahl kann den Unterschied ausmachen.

Eine Funktion mit einem Pfad mit einem einzelnen rekursiven Aufruf am Anfang des Pfads verwendet die sogenannte Kopfrekursion. Die faktorielle Funktion eines vorherigen Exponats verwendet Kopfrekursion. Das erste, was es tut, wenn es bestimmt, dass Rekursion benötigt wird, ist, sich selbst mit dem dekrementierten Parameter aufzurufen. Eine Funktion mit einem einzelnen rekursiven Aufruf am Ende eines Pfads verwendet die Tail-Rekursion. Refer this article

Beispiel Rekursion:

public void tail(int n)    public void head(int n) 
{          { 
    if(n == 1)        if(n == 0) 
     return;        return; 
    else         else 
     System.out.println(n);     head(n-1); 

    tail(n-1);        System.out.println(n); 
}          } 

Wenn der rekursive Aufruf am Ende eines Verfahrens auftritt, ist es ein tail recursion genannt. Die Schwanzrekursion ist similar to a loop. Die method executes all the statements before jumping into the next recursive call.

Wenn der rekursive Aufruf bei beginning of a method, it is called a head recursion erfolgt. Die method saves the state before jumping into the next recursive call.

+2

Umm ... Tail Recursion ist eine separate Sache. Tail Call Optimization ist eine Optimierung, die auf die Tail-Rekursion angewendet werden kann. Sie sind nicht die gleichen wie im ersten Absatz angedeutet. – Sinkingpoint

+1

Sind das nicht im Grunde nur die Definitionen, die das OP selbst angegeben hat? – Radiodef

+1

Kann man ein Beispiel für Kopfrekursion geben? Weil die erste Zeile einer Methode, die die Rekursion sofort aufruft, in meiner Vorstellung eine Endlosschleife erzeugt, nein? wie int recurCall(int number) { int res = recurCall(number -1); ...process...; return res; }. – Julien

Verwandte Themen