Rekursion

7.1 Der Begriff der Rekursion:
7.1.1 Was ist eine Rekursion?
Die Rekursion einer Prozedur besteht darin, den Prozedurnamen in der Prozedur selbst aufzurufen. Das bedeutet, dass, wenn ich eine Prozedur gehe_hin_und_her deklariere und zwischen BEGIN und END nochmal schreibe, dass der Befehl gehe_hin_und_her ausgeführt werden soll. Also in etwa so:

PROCEDURE gehe_hin_und_her;
BEGIN
 WHILE vorne_frei DO vor;
 drehe_um;   { ist deklariert }
 gehe_hin_und_her;
END;
Das Beispiel oben würde NIKI dazu veranlassen, pausenlos hin und her zu laufen. Wenn er an eine Wand kommt, dreht er um und fängt von vorne an. Es würde sich eine Endlosschleife entwickeln, wobei es nur eine Frage der Zeit ist, wann NIKI endlich aufgibt und abstürzt. Wesentlich schneller geht es mit diesem Quellcode:

PROCEDURE absturz;
BEGIN
 absturz;
END;
Hier ist wieder einmal die Windows-Version ein Spielverderber, weil hier nicht direkt abgestürzt wird. Die MS-DOS-Version ist da natürlich durchaus absturzkompatibler. Aber warum kommt es zum Absturz? Weil der Computer nur damit beschäftigt ist, die Prozedur auszuführen. Zu Beginn mag das ja noch gehen, aber schon bald konzentriert sich der Computer nur noch darauf und es kommt zum Absturz. Aber auch hier kann man wieder etwas tun.

7.2 Rekursion an sich:
7.2.1 Anwendung der Rekursion
Am besten kann man Rekursionen in Abfragen einbauen. Eine IF-Abfrage kommt da wie gelegen. Wenn man hier sinnvolle Anweisungen und sinnvolle Bedingungen stellt, kann NIKI ohne Weiteres z.B. ein Labyrinth durchlaufen. Eine wenig sinnvolle Anwendung wäre z.B. eine immer wahre Bedingung zu stellen, wie z.B.:

PROCEDURE sinnlos;
BEGIN
 IF hat_vorrat OR NOT hat_vorrat THEN sinnlos;
END;
Die Abfrage wäre also: Wenn NIKI Vorrat hat oder keinen Vorrat hat, soll er rekursiv arbeiten. Die Bedingung ist in jedem Falle wahr, denn entweder hat NIKI Vorrat oder er hat Keinen. Eine Zwischenstufe gibt es nicht. Theoretisch ist der Quellcode von oben auch so formulierbar:

PROCEDURE sinnlos;
BEGIN
 IF true THEN sinnlos;
END;
Leider kann man in NIKI true nicht als Bedingung nehmen, aber in vielen anderen Programmiersprachen ist das durchaus möglich und auch ab und zu sinnvoll. Aber warum kann man das so zusammenfassen wie eben gezeigt? Darum:

(true OR NOT true) = (true OR false) = true;
(false OR NOT false) = (false OR true) = true;


Das bedeutet, dass, egal ob die Bedingung true oder false ergibt, sie in jedem Falle von dem OR und der entsprechenden Negierung wieder aufgehoben wird. Ist doch einfach, oder? Das Ganze kann man aber auch so konzipieren, dass die Bedingung immer false ergibt. Dazu ersetzt man einfach das OR durch ein AND.

7.2.2 Gefahren der Rekursion
Wie schon oft genug gesagt kann die Rekursion sehr schnell zu einer Endlosschleife und zu einem Absturz kommen. Daher sollte man, auch wenn man sich sicher ist, davon überzeugen, dass die Bedingung auch mal false ergeben kann. Man kann dann ja im Kopf auch die einzelnen Schritte nachvollziehen, um dieses Problem zu vermeiden.
Gerade weil bei der Anwendung der Rekursion immer wieder Abstürze passieren können, ist vor dem compilieren ein Sicherheitsspeichern angebracht. Speichert man nicht, gehen die Daten direkt ohne Nachfrage verloren, wenn es zum Absturz kommt.

7.2.3 Rekursion in Abfragen
Wie gesagt kann man sich vor den Gefahren bei der Rekursion durch eine Abfrage behelfen. Die Rekursion kann man prinzipiell überall in den Quellcode einbauen, also auch zwischen das BEGIN und das END einer IF-Abfrage. Wie schon erwähnt muss man sich aber auch hier sicher sein, dass man eine nicht immer wahre Bedingung eingetippt hat.

Mit dem jetzigen Wissen sollte das Programmieren in NIKI nur noch einfach sein. Die Möglichkeiten von NIKI sind weitgehend erschöpft und ab dem nächsten Kapitel gibt es nur noch Sonderinformationen, die sich mit dem Programmieren an sich beschäftigen. Sie sind lesenswert, tragen aber keine neuen Inhalte mehr für komplexere Programme in sich.
Ich hoffe, Ihnen hat der NIKI-Lehrgang zumindest ein wenig Spaß gemacht!