ich habe irgendwie ein Problem zu erkennen, das in dem
folgenden Programm genau an den Ausgangspunkt zurückgekehrt
wird.
So wird es klarer:
uses crt;
var
x, y: Byte;
frei: Boolean;
vorwaerts: Boolean;
procedure pruef\_frei;
begin
frei := (x ');
inc(X);
end
else begin
write('
In Worten:
- Schau ob frei ist
- ja, also gehe einen Schritt vor
- Schau ob frei ist
...
- Schau ob frei ist
- nein, drehe dich um (Richtung wechselt, nun treten alle vor-Befehle in Kraft, die aufgrund der Rekursion noch nicht ausgeführt wurden}
- Gehe zurück
- Gehe zurück
.... (genauso oft, wie vorgegangen wurde)
Schönen Gruß,
Rudy
Vermtl. liegt hier mein Problem, läuft hier also im
Hintergrund ein Zähler mit, der sich merkt, wie oft die
Prozedur aufgerufen wurde?
Der ‚Zähler‘ ist der Stack. Wenn eine Rekursion betreten wird, also eine Funktion/Prozedur sich selbst aufruft, dann läuft die Funktion an dieser Stelle nicht weiter, sondern füllt an dieser Stelle den Stack (Speicher) und merkt sich den Eintrittspunkt in die Rekursion. Dann läuft sozusagen eine neue Funktion an dieser Stelle weiter (ungeachtet, dass es die Funktion selbst ist). Das geht so lange weiter, bis die Abbruchbedingung erfüllt ist (=umdrehen, dort wird keine Rekursion aufgerufen, gewissermaßen ist die Prozedur also beendet) oder der Stack voll ist (overflow-Error, passiert bei fehlerhaften Rekursionen, die nicht abbrechen oder zu speicherlastig sind). Sobald der rekursive Aufruf beendet ist, läuft die ‚alte‘ Funktion wieder weiter und so fort.
Das würde die richtige Anzahl der „Rückschritte“ erklären.
Aber auch dann, warum springt der Aufruf nicht an den Anfang
der Procedure zurück?
Der Stack wird nach Erfüllung der Abbruchbedingung einfach wieder nach unten abgearbeitet, also alle Funktionen beenden den Durchlauf ab der Stelle, wo sie sich selbst vorher aufgerufen haben. Dadurch, dass sich die Richtung geändert hat, verursacht dies Rückschritte, und klarerweise sind es genauso viele wie Schritte vorwärts.
An Deinem Beispiel:
1) ------------------------ Wird so lange wiederholt, bis Abbruchbedingung erfüllt ist
procedure hin\_rueck; \>\>\>\>\>^ -----
Ich hoffe ich habe es einigermaßen einfach veranschaulichen können :smile:
Ciao,
Rudy
Der ‚Zähler‘ ist der Stack. Wenn eine Rekursion betreten wird,
also eine Funktion/Prozedur sich selbst aufruft, dann läuft
die Funktion an dieser Stelle nicht weiter, sondern füllt an
dieser Stelle den Stack (Speicher) und merkt sich den
Eintrittspunkt in die Rekursion. Dann läuft sozusagen eine
neue Funktion an dieser Stelle weiter (ungeachtet, dass es die
Funktion selbst ist). Das geht so lange weiter, bis die
Abbruchbedingung erfüllt ist (=umdrehen, dort wird keine
Rekursion aufgerufen, gewissermaßen ist die Prozedur also
beendet) oder der Stack voll ist (overflow-Error, passiert bei
fehlerhaften Rekursionen, die nicht abbrechen oder zu
speicherlastig sind). Sobald der rekursive Aufruf beendet ist,
läuft die ‚alte‘ Funktion wieder weiter und so fort.
Das würde die richtige Anzahl der „Rückschritte“ erklären.
Aber auch dann, warum springt der Aufruf nicht an den Anfang
der Procedure zurück?
Der Stack wird nach Erfüllung der Abbruchbedingung einfach
wieder nach unten abgearbeitet, also alle Funktionen beenden
den Durchlauf ab der Stelle, wo sie sich selbst vorher
aufgerufen haben. Dadurch, dass sich die Richtung geändert
hat, verursacht dies Rückschritte, und klarerweise sind es
genauso viele wie Schritte vorwärts.
So langsam wird´s verständlich, allerdings kannte ich eine „Stack-Orientierung“ nur von Forth, wenn man von Assembler absieht.
Aber jetzt mache ich erstmal Schluß, vielen Dank, ich grüble morgen weiter.
…siehst Du, dass sich der Roboter genau fünf mal in Richtung seiner Nase bewegt, sich dann umdreht, und sich anschließend abermals genau fünf Schritte in Richtung seiner Nase bewegt (wobei er jetzt relativ zum Tisch _zurück_geht).
Ich verstehe, schweife jetzt etwas ab, dass dies rekursive Programmieren einfacher sein soll als eine Variable.
Mir fehlen in der Umgebung einfach die Variablen, mal schauen, ich werde wohl auf eine „normale“ Pascal-Umgebung umsteigen.