![]() |
Delphi-Version: XE2
Revision; result überschreiben
Bei der Folgende Function wird mein result immer überschrieben;
Delphi-Quellcode:
Er rechnet richtig, bei 5 120 etc.
function TForm1.Fakulitaet(
n : integer; max : integer; iErgebnis: integer): integer; var I: integer; begin if n <= max then begin iErgebnis := iErgebnis * n; n := n + 1; result := iErgebnis; self.Fakulitaet(n, max, iErgebnis); end; end; Das result ist aber ständig eins .... Wie kann man bei einer rekusiven Function das result nehmen, welches am letzten herausgefunden war. |
AW: Revision; result überschreiben
Du rufst die Funktion procedural auf:
Delphi-Quellcode:
statt
self.Fakulitaet(n, max, iErgebnis);
Delphi-Quellcode:
xxx := Fakulitaet(n, max, iErgebnis);
|
AW: Revision; result überschreiben
Delphi-Quellcode:
Die Fakulität heisst übrigens nur Fakultät, und die Revision im Titel soll vermutlich eine Rekursion sein :)
function TForm1.Fakultaet(
n : integer; max : integer; iErgebnis: integer): integer; begin if n <= max then result := Fakulitaet(n+1, max, iErgebnis*n); end; |
AW: Revision; result überschreiben
Delphi-Quellcode:
function TForm1.Fakulitaet(
n : integer; max : integer; iErgebnis: integer): integer; begin if n <= max then begin iErgebnis := iErgebnis * n; n := n + 1; result := self.Fakulitaet(n, max, iErgebnis); // falsche zuweisung fehlte, end else begin result := iErgebnis; // damit auch richtiges ergebnis kommt end; kleines else und ne result zuweisung haben gefehlt; dank euch :) |
AW: Revision; result überschreiben
Entschuldige bitte die Kritik, aber das ist m.E. viel zu kompliziert implementiert, was auch zu einer schlechten Lesbarkeit und Fehleranfälligkeit führt.
Du führst unnötigerweise den Endwert und das Zwischenergebnis bei jedem Funktionsaufruf mit. Dabei wird unnütz viel Stack verbraucht. Bei der Fakultät wird zwar wohl erst der Integerüberlauf vor einem Stacküberlauf eintreten, aber man sollte doch seine Resourcen gerade bei Rekursionen nicht unnötig verschwenden. Günstiger ist es hier, das Pferd von hinten aufzuzäumen:
Delphi-Quellcode:
function Fakultaet(n: Integer): Integer;
begin if n = 1 then result := 1 else result := n*Fakultaet(n-1); end; |
AW: Revision; result überschreiben
Moin,
Zitat:
Delphi-Quellcode:
function Fakultaet(n: Integer): Integer;
var i:integer; begin result := 1; // just start at 2, because 0! and 1! is 1 for i:= 2 to n do result := result * i; end; P.S.: funktioniert natürlich so nur für die Fakultät von positiven Zahlen ;-) |
AW: Revision; result überschreiben
Da der rekursive Funktionsaufruf die letzte Anweisung der Methode war, würde ich so etwas eigentlich schon dem Compiler überlassen, dass dahingehend zu optimieren ("Tail Recursion").
Der Delphi Win32-Compiler optimiert das (glaube ich) zwar nicht dahingehend, aber das geht alles irgendwie auch schon weit über die ursprüngliche Frage hinaus ;-) |
AW: Revision; result überschreiben
Zitat:
Zitat:
|
AW: Revision; result überschreiben
Zitat:
(Nja, und "i wurde deklariert, aber nicht verwendet".) Und daß du das Ergebnis von dem rekursiven Fakulitaet-Aufruf nicht auswertest, hatte hier schon jemand erwähnt. PS: Seit 2009 kannst du auch beruhigt "Fakulität" schreiben. |
AW: Revision; result überschreiben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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 by Thomas Breitkreuz