„Iterative Programmierung“ – Versionsunterschied
[gesichtete Version] | [gesichtete Version] |
Arilou (Diskussion | Beiträge) Die Einleitung sollte sich mit dem Artikelthema befassen, und nicht stark überwiegend (hier 3/4) mit dem Gegenteil, v.a. wenn's sowieso ein extra Kapitel dafür gibt. |
Arilou (Diskussion | Beiträge) →Gegenüberstellung: einige Vorteile bestehen nicht gegenüber endrekursiven Funktionen |
||
Zeile 10: | Zeile 10: | ||
Iterative Implementierungen bieten jedoch oft Vorteile: |
Iterative Implementierungen bieten jedoch oft Vorteile: |
||
* Bei iterativer Programmierung kann der Speicherbedarf schärfer durch den Programmierer zugeschnitten und kontrolliert werden, wogegen bei rekursiver bei jedem Selbstaufruf |
* Bei iterativer Programmierung kann der Speicherbedarf schärfer durch den Programmierer zugeschnitten und kontrolliert werden, wogegen bei rekursiver bei jedem Selbstaufruf der Kontext der aufrufenden Prozedur (im Programm-Stapelspeicher) zu retten ist, damit er beim [[Rücksprung]] wieder hergestellt werden kann (beachte Sonderfall [[Endrekursion]]). |
||
* Darüber hinaus ist der Speicherbedarf für den Programm-[[Stapelspeicher]] programmiersprachlich schwer oder gar nicht kontrollierbar, wovon die berüchtigten [[Stapelüberlauf|Stapelüberläufe]] eine Folge sind. |
* Darüber hinaus ist der Speicherbedarf für den Programm-[[Stapelspeicher]] programmiersprachlich schwer oder gar nicht kontrollierbar, wovon die berüchtigten [[Stapelüberlauf|Stapelüberläufe]] eine Folge sind. (Dito Endrekursion) |
||
* Im rekursiven Programmierstil lassen sich manche Szenarien nur durch eine sog. [[Rückruffunktion]] ({{enS|''callback function''}}) realisieren. Beispielsweise wird bei einer rekursiv programmierten [[Binärbaum#Traversierung|Traversierfunktion]] eines Binärbaums dieser stets in seiner Gänze durchlaufen und die Nutzfunktion in einem Rückruf implementiert.<br/>Im Gegensatz dazu kann bei iterativer Programmierung das zu bearbeitende Segment des Baums durch eine [[Binärer Suchbaum#Suchen|Suchfunktion]] angesteuert, die Nutzfunktion nach Belieben als flache Anweisungsfolge bzw. als Unterprogramm implementiert und nach einem [[Binärbaum#Iterative Implementierung|(iterativen) Querschritt]] beim nächsten Element wiederholt werden.<ref>Siehe dazu [[Binärbaum#Traversierung|Traversierung]] (mit Codebeispielen) und Ben Pfaff: ''An Introduction to Binary Search Trees and Balanced Trees.'' Free Software Foundation, Inc. Boston 2004, S. 47 „4.9.2 Traversal by Iteration“.</ref> |
* Im rekursiven Programmierstil lassen sich manche Szenarien nur durch eine sog. [[Rückruffunktion]] ({{enS|''callback function''}}) realisieren. Beispielsweise wird bei einer rekursiv programmierten [[Binärbaum#Traversierung|Traversierfunktion]] eines Binärbaums dieser stets in seiner Gänze durchlaufen und die Nutzfunktion in einem Rückruf implementiert.<br/>Im Gegensatz dazu kann bei iterativer Programmierung das zu bearbeitende Segment des Baums durch eine [[Binärer Suchbaum#Suchen|Suchfunktion]] angesteuert, die Nutzfunktion nach Belieben als flache Anweisungsfolge bzw. als Unterprogramm implementiert und nach einem [[Binärbaum#Iterative Implementierung|(iterativen) Querschritt]] beim nächsten Element wiederholt werden.<ref>Siehe dazu [[Binärbaum#Traversierung|Traversierung]] (mit Codebeispielen) und Ben Pfaff: ''An Introduction to Binary Search Trees and Balanced Trees.'' Free Software Foundation, Inc. Boston 2004, S. 47 „4.9.2 Traversal by Iteration“.</ref> |
||
Mit wachsender Leistungsfähigkeit der Rechner tritt jedoch die Lesbarkeit und Wartbarkeit von Software gegenüber ihrer technischen Effizienz in den Vordergrund. Wo dies der Fall ist, bietet sich der rekursive Ansatz für die Arbeit mit baumartigen Datenstrukturen und der iterative für sequenzielle Datenstrukturen an. |
Mit wachsender Leistungsfähigkeit der Rechner tritt jedoch die Lesbarkeit und Wartbarkeit von Software gegenüber ihrer technischen Effizienz in den Vordergrund. Wo dies der Fall ist, bietet sich der rekursive Ansatz für die Arbeit mit baumartigen Datenstrukturen und der iterative für sequenzielle Datenstrukturen an. |
Version vom 21. April 2021, 09:54 Uhr
Die iterative Programmierung (von lat. iterare = wiederholen) ist ein Konzept, bei dem mehrfach auszuführende Arbeitsschritte in Schleifen (Wiederholungen von Anweisungen oder Anweisungsfolgen) umgesetzt werden.
Abgrenzung
Andere Programmierkonzepte sind
- die rekursive Programmierung, die für mehrfach auszuführende Arbeitsschritte Rekursion verwendet (wiederholte Selbstaufrufe eines Programmteils); prinzipiell lassen sich rekursive Algorithmen auch iterativ implementieren und umgekehrt.
- die logische Programmierung, die Lösungen für Probleme nicht über Anweisungsfolgen findet, sondern durch regelbasierte logische Folgerung.
Gegenüberstellung
In der Literatur werden Funktionen gerne im rekursiven Programmierstil vorgestellt, die meist als einfacher zu verstehen gelten. Bei rekursiver Programmierung wird die Wiederholung erreicht, ohne dass das Programm explizite Schleifen enthält.[1] Anstatt Schleifenkontrollanweisungen enthält das Programm einen sogenannten Selbstaufruf der betreffenden Funktion, die dadurch (bei Endrekursion) unendlich oft ausgeführt werden könnte. Um eine endliche Anzahl Wiederholungen zu erreichen, benötigt das Programm ebenso eine Abbruchbedingung (oder einen nichtrekursiven Ausführungszweig) wie die Schleife bei der iterativen Programmierung.
Iterative Implementierungen bieten jedoch oft Vorteile:
- Bei iterativer Programmierung kann der Speicherbedarf schärfer durch den Programmierer zugeschnitten und kontrolliert werden, wogegen bei rekursiver bei jedem Selbstaufruf der Kontext der aufrufenden Prozedur (im Programm-Stapelspeicher) zu retten ist, damit er beim Rücksprung wieder hergestellt werden kann (beachte Sonderfall Endrekursion).
- Darüber hinaus ist der Speicherbedarf für den Programm-Stapelspeicher programmiersprachlich schwer oder gar nicht kontrollierbar, wovon die berüchtigten Stapelüberläufe eine Folge sind. (Dito Endrekursion)
- Im rekursiven Programmierstil lassen sich manche Szenarien nur durch eine sog. Rückruffunktion (englisch callback function) realisieren. Beispielsweise wird bei einer rekursiv programmierten Traversierfunktion eines Binärbaums dieser stets in seiner Gänze durchlaufen und die Nutzfunktion in einem Rückruf implementiert.
Im Gegensatz dazu kann bei iterativer Programmierung das zu bearbeitende Segment des Baums durch eine Suchfunktion angesteuert, die Nutzfunktion nach Belieben als flache Anweisungsfolge bzw. als Unterprogramm implementiert und nach einem (iterativen) Querschritt beim nächsten Element wiederholt werden.[2]
Mit wachsender Leistungsfähigkeit der Rechner tritt jedoch die Lesbarkeit und Wartbarkeit von Software gegenüber ihrer technischen Effizienz in den Vordergrund. Wo dies der Fall ist, bietet sich der rekursive Ansatz für die Arbeit mit baumartigen Datenstrukturen und der iterative für sequenzielle Datenstrukturen an.
Beispiel
Ein Beispiel für die iterative Programmierung ist ein Datenbankdurchlauf (Pascal) durch die Datensätze („Zeilen“) von (der „Tabelle“) Dataset
:
procedure Durchlauf;
begin
while not Dataset.Eof do ! wiederhole_solange Tabelle Dataset nicht „zu Ende“ ist
begin ! den hier beginnenden Befehlsblock
Befehl1;
Befehl2;
Befehl3;
Dataset.Next; ! Schalte weiter zum nächsten Datensatz (nächste „Zeile“) von Dataset.
end;
end;
Dabei werden die Befehle 1 bis 3 solange wiederholt, bis alle Datensätze durchlaufen wurden.
Anmerkungen und Einzelnachweise
- ↑ Niklaus Wirth: Algorithmen und Datenstrukturen, B. G. Teubner 1983, Seite 150
- ↑ Siehe dazu Traversierung (mit Codebeispielen) und Ben Pfaff: An Introduction to Binary Search Trees and Balanced Trees. Free Software Foundation, Inc. Boston 2004, S. 47 „4.9.2 Traversal by Iteration“.