Ahh, die Rekursionen:
Quelltext
Hier wird der Funktion f die Zahl 5 übergeben. Der Parameter ist in f als n deklariert, also n = 5.
Quelltext
Ein weiterer Integer, der nur in dieser Funktion gültig ist. Die Funktionsaufrufe in der Rekursion kriegen jedesmal eine neue h-Variable.
Quelltext
1:
| IF n<=1 THEN h:=1 ELSE h:=f(f(n-2))-1; |
Falls n kleiner oder gleich 1 ist, dann ist h auch 1. Ansonsten ist h was anderes. Da n beim ersten mal 5 ist, passiert folgendes:
f wird erneut aufgerufen, mit n = 3 (weil: f(n-2) ).
Da dort n wieder größer als 1 ist, wird erneut f aufgerufen, diesmal mit n = 1 (weil ein zweites mal f(n-2) und n ist 3). Wir sind jetzt in der dritten Verschachtelung! Diesmal ist das Ergebnis 1, weil h = 1 gesetzt wird und weiter unten f := h steht. Jetzt wird die dritte Verschachtelung verlassen und in der zweiten fehlt ja noch einmal das f(1)-1. Das Ergebnis ist 0, weil 1 - 1 0 ergibt. Wieder in der ersten Verschachtelung angekommen (die von WRITELN(f(5)) aufgerufen wurde) ist ja auch nochmal ein zweites f(). Dort ist aber der Parameter wieder 0. Die Funktion wird erneut aufgerufen und als Ergebnis kommt 1 zurück, weil n kleiner als 1 ist (0).
h ist jetzt also 1.
Quelltext
Hier wird das Ergebnis der Funktion auf h gesetzt (manchen besser bekannt als result := h), und da h = 1 ist, ist das endgültige Ergebnis der funktion auch 1. Und da das Ergebnis 1 ist, gibt
Quelltext
die Zahl 1 aus.
Diese Rekursion erfüllt zwar keinen genauen Zweck, sollte aber ohne Zweifel zum Verständnis von Rekursionen gedacht sein...
Mars' Kombination aus 1 und 0 kommt daher, weil zwischendurch immer wieder Writeln aufgerufen wird, und der Wert von h an diesen Stellen immer entweder 1 oder 0 ist. Aber die letzte Zahl ist 1.
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk.