Wie im Konzept der Programmiersprachen von Sebesta erwähnt:
Warum unterstützen statische Variablen keine Rekursion? Liegt das daran, dass wenn Rekursion stattfindet, es viel Speicher verschwendet, weil es static
ist und dies bedeutet, dass es nicht aus dem Speicher freigegeben wird, bis das vollständige Programm beendet ist?
Sehen Sie sich Eric Lipperts Antwort an. Diese Antwort zeigte auf einen Link, der nicht mehr verfügbar ist, und da es eine akzeptierte Antwort ist, kann ich sie jetzt nicht löschen.
Was die Verwendung von statischen Feldern in rekursiven Algorithmen erschwert, ist nicht, dass sie statisch sind, sondern dass sie keiner Aktivierung zugeordnet sind . Nicht-statische Felder sind in einem rekursiven Algorithmus gleichermaßen schwierig zu verwenden.
Außerdem ist das Problem nicht, dass es schwierig ist, Felder mit rekursiven Algorithmen zu verwenden, sondern generell, dass es schwierig ist, Felder mit reentranten Algorithmen zu verwenden. oder Algorithmen, bei denen der gleiche Code für mehrere Threads aufgerufen wird.
Was lokale Variablen und formale Parameter in Rekursions- und anderen Reentrenzenszenarien nützlich macht, ist, dass sie mit einer Aktivierung verknüpft sind .
Kurz gesagt: Das Buch ist verwirrend, weil es zu spezifisch ist. Es ist, als würde man sagen, dass es schwierig ist, ein braunes Ei auf einem weißen Tisch zu balancieren; Das stimmt, aber was haben Braun und Weiß damit zu tun? Es ist schwierig, jedes Ei in any -Tabellen auszubalancieren. Es ist schwierig, ein statisches Feld in einem rekursiven Aufruf korrekt zu verwenden, da es schwierig ist, any -Feld in jedem Reentrence-Szenario zu verwenden.
Jeder rekursive Aufruf greift auf die gleiche statische Variable zu und überschreibt Werte, die in der Variablen durch andere Aufrufe gespeichert sind. Dies ist im Allgemeinen nicht erwünscht, wenn eine Rekursion durchgeführt wird, es sei denn, die statische Variable dient einem rein iterativen Zweck, z. Zählen, wie oft die Funktion aufgerufen wurde.
Vielleicht kann ein Beispielcode veranschaulichen, wie der Speicher bei der Rekursion verwaltet wird. Und wie die Verwendung einer statischen Variable in einer rekursiven Routine kein Starter ist (eine mögliche Ausnahme ist, wenn Sie einen globalen Zähler zum Zählen haben möchten, wie oft eine Funktion aufgerufen wird, unabhängig davon, wie die Methode aufgerufen wurde (z. B. aus Multi-Threading oder Konsekutiv) Ruf))
Gegeben dieser C-Code:
%Vor%Ausgabe:
%Vor% Wie wir sehen können, hat die Variable static i
nur eine Stelle im Speicher; und als solche können die Werte zwischen Anrufen überleben. Dies ist nicht wünschenswert, wenn Sie ein bestimmtes Problem teilen und überwinden möchten, insbesondere bei Methodenaufrufen mit mehreren Threads. Wenn zwei gleichzeitige Aufrufe auf der Methode callMe
ausgeführt werden, kann die andere CallMe ihre Aufgabe möglicherweise nicht abschließen, da diese Methodenaufrufe nur die gleiche Variableninstanz verwenden (statische Variablen). Diese Methodenaufrufe wirken sich gegenseitig aus , diese Methoden können nicht unabhängig voneinander arbeiten, da sie keine unabhängige Kopie von Variablen haben.
Wenn der obige Code nicht multi-threaded ist, kann der nächste Methodenaufruf seine Aufgabe nicht beenden, da der zweite Aufruf auf die gleiche Variable (statische Variable) zugreift und einen Wert erhält, der bereits durch vorherige Methodenaufrufe verdorben wurde
Vereinfacht ausgedrückt sind statische Variablen, selbst wenn sie innerhalb einer Funktion liegen, immer noch eine globale Variable. Statische Variablen innerhalb einer Funktion verhindern nur Namenskollisionen, aber statische Variablen sind in jeder Hinsicht globale Variablen
Um die Leistung des Codes zu verbessern, ändern Sie if (i < 10)
in if (j < 10)
Übrigens, nicht statischen Variablen wird ihr eigener Speicher zugewiesen, der auf dem Stack zugewiesen wird. Wenn wir nach vielen rekursiven Aufrufen keine Abbruchbedingung haben, wird der obige Code zu einem Stack-Überlauffehler führen. Hier hat stackoverflow seinen Namen. Es genügt zu sagen, Programmierer lieben Rekursion /
Live-Test: Ссылка
Rekursion schichtet mehrere Instanzen eines Objekts, wobei jede Instanz ihre eigenen Daten beibehält. Eine statische Variable wird für alle Instanzen freigegeben. Ich bin mir sicher, dass eine statische Variable von einem rekursiven Prozess verwendet werden kann, und wäre angemessen, wenn sie als Konstante verwendet wird, kann aber das Debugging bei dynamischer Verwendung erschweren.