Autor Beitrag
crazy_pirate
Hält's aus hier
Beiträge: 2



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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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

_________________
Ich kam, sah und schrieb ein Prog.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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

_________________
Ich kam, sah und schrieb ein Prog.
crazy_pirate Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 30.03.03 11:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: So 30.03.03 13:03 
Ahh, die Rekursionen:
ausblenden 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.

ausblenden 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.

ausblenden 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.

ausblenden 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
ausblenden 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.

_________________
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. - Dilbert