![]() |
Rekursion - Berechnung von Fakultäten
Hey ihr,
hab grad nen Problem mit der Rekursion. Sollten Fakultäten auf zwei Wegen berechnen - iterativ (Button1) und rekursiv (Button2):
Delphi-Quellcode:
Mein Problem bezieht sich auf die Funktion fakultaet. Und zwar habe ich durch Recherche die Variable "result" gefunden und versuchsweise eingefügt - mysteriöserweise funktioniert es auch, obwohl ich result nirgends bewusst definiert habe (vordefiniert???) und es sonst auch nicht in dieser *.pas-Datei auftaucht.
function fakultaet (a: integer) : integer;
begin if a>0 then result := a * fakultaet(a-1) else result:=1; end; procedure TForm1.BitBtn1Click(Sender: TObject); var text, i, ergebnis : integer; begin text:=StrToInt(Edit1.Text); ergebnis:=1; for i:=1 to text do begin ergebnis:=ergebnis*i; Label1.Caption:=IntToStr(ergebnis); end; if text=0 then Label1.Caption:=IntToStr(1); //(0!=1) if text<0 then Label1.Caption:='Bitte geben Sie eine natürliche Zahl ein!'; //text\in N end; procedure TForm1.BitBtn2Click(Sender: TObject); var k : integer; begin k:=fakultaet(StrToInt(Edit1.Text)); Label1.Caption:=IntToStr(k); end; Nehme ich als Variable irgendetwas anderes, meckert er wieder wegen einer undefinierten Variable - wo soll ich die denn definieren? Definiere ich es so
Delphi-Quellcode:
komme ich auch nicht weiter, ich erhalte immer dasselbe Ergebnis 43tausend und ein paar zerquetschte (auch wenn ich zwsp als integer definiere).
function fakultaet (a: integer) : integer;
var zwsp : integer; begin if a>0 then zwsp := a * fakultaet(a-1) else zwsp:=1; end; Woher kommt nu die vordefinierte "result"-Variable und wie bastel ich das Programm ohne eben diese zusammen`? Bitte helft mir ^^ |
Re: Rekursion - Berechnung von Fakultäten
Hallo,
richtig erkannt, result ist im Endeffekt vordefiniert und gibt ein Funktionsergebnis zurück. Anstelle von result kann man auch den Funktionsnamen verwenden, wenn ich das recht in Erinnerung habe. Ohne Rückgabewert würde dir eine (rekursive) Funktion nichts bringen, da eine Funktion unter anderem dafür da ist, etwas zurückzugeben. Ich würde die Fakultät so berechnen (ungetestet):
Delphi-Quellcode:
Das, worauf es ankommt bzw. das, was ein wenig Überlegung erfordert, ist der rekursive Aufruf, den du genau richtig erkannt hast:
function fakultaet(a: Integer): Integer;
begin if (a = 0) or (a = 1) then // 0! = 1! = 1 result := 1 else result := fakultaet(a - 1) * a; end;
Delphi-Quellcode:
Das "Drumherum" mit dem Rückgabewert wirst du vermutlich gleich verstehen, sobald du den obigen Code verinnerlichst.
zwsp := a * fakultaet(a-1)
|
Re: Rekursion - Berechnung von Fakultäten
Das result entspricht dem return in anderen Sprachen. Unter klassischem Pascal verwendete man, wie matze schon angedeutet hat den Namen der Funktion
Delphi-Quellcode:
ist also gleichbedeutend wie
result := fakultaet(a - 1) * a;
Delphi-Quellcode:
fakultaet := fakultaet(a - 1) * a;
|
Re: Rekursion - Berechnung von Fakultäten
@MAtze
dir ist klar das der Aufruf mit Negativen Zahlen einen Stack overflow erzeugt ? |
Re: Rekursion - Berechnung von Fakultäten
Zitat:
|
Re: Rekursion - Berechnung von Fakultäten
Hi nochmal,
sorry für die späte Antwort - funzt jetzt^^. Dankeschön :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz