|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 78
|
Verfasst am: 26.04.2023, 00:29 Titel: Rekursive Programmierung |
|
|
Hallo Leute,
hier mal eine fachliche Anfrage zu diesem Thema.
Rekursive Programmierung scheint ein sehr mächtiges "Werkzeug" zu sein.
Aber selbst das beste Werkzeug macht keinen Sinn, wenn man es nicht zu benutzen versteht. Mir geht es genau so.
Alle meine Programme habe ich bisher streng linear programmiert,
also eins nach dem anderen, Schritt für Schritt, Zeile für Zeile.
Bei komplexeren Problemen habe ich mich erwartungsgemäß schnell zwischen den ganzen nötigen Variablen komplett verzettelt.
Ich weiß nur grundsätzlich, daß sich bei rekursiver Programmierung eine Routine immer wieder selbst aufruft, bis eine bestimmte Abbruchbedingung erfüllt ist.
Aber:
Jeder erneute Aufruf ist eine zusätzliche "Bearbeitungsebene".
Das Ergebnis jeder einzelnen "Bearbeitungsebene" muß sich das Hauptprogramm ja irgend wie "merken".
Wenn z.B. 100 "Bearbeitungsebenen" nötig sind, geht der erforderliche Speicherbedarf doch wohl zwangsläufig "durch die Decke".
Oder ist das ein Trugschluß meinerseits?
Ich habe probeweise mal versucht, die Fakultät einer Zahl also (X!)
rekursiv zu bestimmen, bin aber mit "Pauken und Trompeten" gescheitert.
Ich hatte immer mit der Mitteilung "Speicherüberschreitung" zu kämpfen.
Offenbar habe ich das alles bisher niemals so richtig verstanden.
Vielleicht gab es auch einfach nur einen ganz kleinen Aspekt, den ich laienhaft nicht berücksichtigt habe. Keine Ahnung.
Kann mir jemand das rekursive Programmieren wirklich "wasserdicht" beibringen ? Welche fachlichen "Fallstricke" sollte ich dabei beachten?
Ist sicher eine anspruchsvolle Aufgabe, aber um so größer werden mein Dank und meine Anerkennung sein, wenn ich es endlich mal begriffen habe.
PS: Wann ist es überhaupt zweckmäßig, rekursiv zu programmieren?
Mit netten Grüßen Revilo |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4636 Wohnort: ~/
|
Verfasst am: 26.04.2023, 19:01 Titel: |
|
|
Aus Zeitgründen erst einmal nur eine kleine Teil-Antwort:
Zitat: | Wenn z.B. 100 "Bearbeitungsebenen" nötig sind, geht der erforderliche Speicherbedarf doch wohl zwangsläufig "durch die Decke".
Oder ist das ein Trugschluß meinerseits? |
Prinzipiell ist das richtig, hängt aber auch von der Umsetzung ab - also davon, wie viele Daten die einzelne Ebene speichern muss. Bei sparsamer Datenlage sind 100 Rekursionsschritte noch gar kein Problem. Aber zumindest den Rücksprungpunkt muss sich jede Ebene merken.
(In funktionalen Sprachen kann man versuchen, mit Endrekursion zu arbeiten; dann ist sogar die Rücksprungadresse kein Problem mehr. Aber das ist erst einmal eine ganz andere Sache.)
Ich versuche später noch ein bisschen weiter zu antworten. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2514 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4636 Wohnort: ~/
|
Verfasst am: 26.04.2023, 20:53 Titel: |
|
|
Das rekursive Durchsuchen des Verzeichnisses ist übrigens ein sehr gutes Beispiel, wo Rekursion sinnvoll ist. Überhaupt jede Art von Tiefensuche - beispielsweise werden Spielzugberechnungen eines Computerspielers häufig rekursiv gemacht.
Mein Laser-Spiel arbeitet auch mit Rekursion. Es gibt für den Laserstrahl eine Funktion zur Wegberechnung; und wenn der Laserstrahl auf einen Spiegel trifft, der ihn auf zwei Wege aufteilt, wird wiederum zweimal diese Funktion aufgerufen.
Eine Reihe von Sortieralgorithmen arbeiten ebenfalls rekursiv (divide et impera)
Noch ein paar nachgeschobene Antworten:
Zitat: | Ich habe probeweise mal versucht, die Fakultät einer Zahl also (X!)
rekursiv zu bestimmen, bin aber mit "Pauken und Trompeten" gescheitert.
Ich hatte immer mit der Mitteilung "Speicherüberschreitung" zu kämpfen. |
Möglicherweise wurde die Abbruchbedingung nicht gesetzt oder nie erreicht. In Pseudocode sieht es in etwa so aus:
Code: | Function falultaet(x)
Wenn x = 0:
Gib 1 zurück.
Sonst:
Gib x * fakultaet(x-1) zurück. |
Der oben angegebene Code scheitert aber, wenn die Funktion mit negativem Parameter (z. B. x = -1) oder mit einem Dezimalwert (z. B. x = 2.5) aufgerufen wird, denn fakultaet(2.5) ruft dann fakultaet(1.5) auf, das dann fakultaet(0.5), das dann fakultaet(-0.5) usw.; der Abbruchwert wird nie erreicht. Theoretisch ginge die Rekursion damit unendlich weiter, aber früher oder später kommt es zu einem Speicherüberlauf. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|