Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Rekursive Programmierung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 69

BeitragVerfasst am: 25.04.2023, 23:29    Titel: Rekursive Programmierung Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 26.04.2023, 18:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 26.04.2023, 18:07    Titel: Antworten mit Zitat

Vor langer Zeit geschrieben:

https://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SUB-Unterprogramme.html

Hier ansonsten auch ein Kapitel für Rekursion dabei. Falls Du FreeBasic verwendest:

https://www.freebasic-portal.de/befehlsreferenz/dir-197.html

Damit lassen sich bekanntlich Dateien in einem Verzeichnis als Schleife durchgehen. Passende Übung dazu: Operation
Code:
dir /s

(Windows) bzw.
Code:
ls -R

(Linux) einmal selber damit implementieren, d.h. das Ganze in eine SUB packen, welche sich beim Auffinden eines Unterverzeichnisses selber aufruft und dieses dann durchgeht.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 26.04.2023, 19:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz