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 data
ist nur ein Zeiger auf eine Art von Daten. Das zweite Element next
ist ein Zeiger auf eine andere ListNode
Struktur. Wenn Sie zwei oder mehr ListNode
Strukturen haben, können Sie den next
Zeiger 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 next
Zeiger gesetzt node
, um auf sich node
selbst 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.
recursion
bezieht sich auf eine Funktion, die sich selbst aufruft, währendself-reference
sich auf ein Objekt bezieht, das auf sich selbst verweist.