Die Wikipedia-Artikel sind zu weit fortgeschritten, als dass ich sie verstehen könnte. Könnte mir bitte jemand eine einfache Erklärung geben?
Die Wikipedia-Artikel sind zu weit fortgeschritten, als dass ich sie verstehen könnte. Könnte mir bitte jemand eine einfache Erklärung geben?
Antworten:
Der Kontext der beiden Begriffe ist im Allgemeinen unterschiedlich.
Selbstreferenzierung erfolgt im Kontext von Daten - Sie haben einen Datentyp, der einen Verweis auf etwas vom gleichen Typ enthält.
Rekursiv ist im Kontext von Code - Sie haben eine Funktion oder Prozedur, die sich selbst aufruft.
Beispiel:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
Hier ist eine rekursive Funktion (in C):
unsigned int fibonacci(unsigned int n)
{
unsigned int result = 1;
if (n > 1)
result = fibonacci(n - 1) + fibonacci(n - 2);
return result;
}
Diese beiden Aufrufe fibonacci()innerhalb der fibonacci()Funktion sind rekursive Aufrufe.
Hier ist eine selbstreferenzielle Datenstruktur :
struct ListNode {
char *data;
struct ListNode *next;
}
Das erste Element dataist nur ein Zeiger auf eine Art von Daten. Das zweite Element nextist ein Zeiger auf eine andere ListNodeStruktur. Wenn Sie zwei oder mehr ListNodeStrukturen haben, können Sie den nextZeiger von einer auf die Adresse einer anderen usw. setzen, und Sie haben dann eine verknüpfte Liste . Die Struktur ist selbstreferenziell, da sich die Definition der Struktur auf sich selbst bezieht. Wenn du wirklich verrückt werden willst, kannst du das tun:
struct ListNode *node = malloc(sizeof(struct ListNode));
node->data = someString;
node->next = node;
Jetzt haben Sie eine andere Art von Selbstreferenz - es ist nicht nur die Definition struct ListNode, die sich auf sich selbst bezieht ... Sie haben den nextZeiger gesetzt node, um auf sich nodeselbst zu zeigen. Dies ist eine zirkuläre verknüpfte Liste, die nur ein Element enthält. Süß, aber nicht sehr nützlich. Ich erwähne es, weil es eine Art Selbstreferenz ist, aber es ist nicht das, was Menschen normalerweise meinen, wenn sie über selbstreferenzielle Datentypen sprechen.
Es wird erwartet, dass Rekursionen, meistens nützliche, nach einer bestimmten Anzahl von Prozeduren in dem Sinne beendet werden, dass es einen Anfangswert gibt. es sei denn, Sie haben eine schlechte Rekursion, die nutzlos ist.
Selbstreferenzen sind an sich keine rekursiven Rekursionen, es kann jedoch gezeigt werden, dass sie rekursiv sind. In diesem Fall werden sie im Allgemeinen nie beendet.
Rekursion impliziert Aktion.
Beispiele:
Technisch gesehen sollte die Rekursion einen Exit-Status haben, dies ist jedoch keine Voraussetzung.
Selbstreferenz impliziert Struktur.
Ex. Eine Instanzmethode, die auf das Objekt verweist, an das sie angehängt ist.
Für die Rekursion muss etwas verarbeitet werden, indem derselbe Prozess aufgerufen wird (häufig mit unterschiedlichen Parametern). Obwohl Sie häufig Funktionen verwenden und diese Funktionen sich selbst aufrufen, treten sie technisch in einen neuen Schritt ein, der zufällig wie der Ort aussieht, von dem sie gerade gekommen sind.
Selbstreferenz bedeutet, dass sich etwas auf sich selbst bezieht. Klassen können mithilfe von selbstreferenziell sein this, aber das ist nicht sinnvoll rekursiv.
recursionbezieht sich auf eine Funktion, die sich selbst aufruft, währendself-referencesich auf ein Objekt bezieht, das auf sich selbst verweist.