Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Rekursionen


crazy_pirate - Sa 29.03.03 15:27
Titel: Rekursionen
Guten Tag!
ich habe ein problem mit folgender Rekursion.was gibt sie aus und warum?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
PROGRAM Rek;

FUNCTION f(n:integer):integer;
VAR h:integer;
BEGIN
IF n<=1 THEN h:=1 ELSE h:=f(f(n-2))-1;
WRITELN(h);
f:=h;
END;

BEGIN
WRITELN(f(5));
END.


Moderiert von user profile iconUGrohne: Code-Tags eingefügt


madigeMade - Sa 29.03.03 21:58

Hi pirate!

Du arbeitest mit pascal oder... dann müsste er 1 ausgeben... wenn du mit delphi arbeitest, gibt es den Befehl WRITELN nur bei der Arbeit mit dateien

Gruß de Made


Delete - Sa 29.03.03 22:14

madigeMade hat folgendes geschrieben:

Du arbeitest mit pascal oder... dann müsste er 1 ausgeben... wenn du mit delphi arbeitest, gibt es den Befehl WRITELN nur bei der Arbeit mit dateien

Du solltest den Publikumsjoker nutzen oder jemanden anrufen:
Zitat:

When an application is compiled as a console application (using the Generate console application checkbox on the Linker page of the Project|Options dialog, or a -cc command line switch with the command-line compiler), Delphi automatically associates the Input and Output files with the application's console window.


madigeMade - Sa 29.03.03 22:28

Juht hab nix gesagt... bin eigentlich auch noch relativ neu bei delphi... sonst kenn ich des nur von pascal...

Gruß de Made


crazy_pirate - So 30.03.03 11:54
Titel: Rekursionen
aber warum gibt das programm 1 aus? den quelltext kompilen und dann vom computer ausrechnen lassen is ja easy. wie kommst du denn darauf, das 1 dabei herauskommt?


mars - So 30.03.03 12:40

Das Programm gibt IMO nach gar nicht eins aus, sondern eine Kombination aus 1 und 0. Und wenn du es wirklich wissen willst, drück mal bei der ersten Zeile F5 und starte dann das Programm. Und dann immer schön F7, F7... :wink:


tommie-lie - So 30.03.03 13:03

Ahh, die Rekursionen:

Quelltext
1:
WRITELN(f(5));                    

Hier wird der Funktion f die Zahl 5 übergeben. Der Parameter ist in f als n deklariert, also n = 5.


Quelltext
1:
VAR h:integer;                    

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
1:
f:=h;                    

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
1:
WRITELN(f(5))                    

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.