AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Revision; result überschreiben

Ein Thema von Mokus · begonnen am 8. Nov 2013 · letzter Beitrag vom 8. Nov 2013
Antwort Antwort
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Revision; result überschreiben

  Alt 8. Nov 2013, 10:23
Delphi-Version: XE2
Bei der Folgende Function wird mein result immer überschrieben;

Delphi-Quellcode:
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;
Er rechnet richtig, bei 5 120 etc.

Das result ist aber ständig eins ....

Wie kann man bei einer rekusiven Function das result nehmen, welches am letzten herausgefunden war.
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 10:32
Du rufst die Funktion procedural auf:

self.Fakulitaet(n, max, iErgebnis); statt

xxx := Fakulitaet(n, max, iErgebnis);
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 10:33
Delphi-Quellcode:
function TForm1.Fakultaet(
  n : integer;
  max : integer;
  iErgebnis: integer): integer;
begin
  if n <= max then
    result := Fakulitaet(n+1, max, iErgebnis*n);
end;
Die Fakulität heisst übrigens nur Fakultät, und die Revision im Titel soll vermutlich eine Rekursion sein
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 8. Nov 2013 um 10:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 10:44
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
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#5

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 11:00
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
260 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 13:08
Moin,

...wird unnütz viel Stack verbraucht..... Stacküberlauf eintreten,

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;
Dann sparen wir uns doch am besten die Rekursion komplett(spart noch mehr Stack) und frühstücken das ganze mit einer simplem loop ab....

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
Dirk

Geändert von noisy_master ( 8. Nov 2013 um 13:10 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 13:28
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#8

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 13:40
Dann sparen wir uns doch am besten die Rekursion komplett(spart noch mehr Stack) und frühstücken das ganze mit einer simplem loop ab....
Ich weiß nicht, ob das hier der Fall ist, aber die Berechnung der Fakultät wird im Informatik-Unterricht gern als Beispiel für Rekursion genommen. Dazu möchte ich hier gern noch eine Anekdote aus dem Informatik-Unterricht (Pascal) meiner Tochter loswerden:

Zitat:
Lehrer: Wir nennen die Funktion mal FAK.
(Tosendes Gelächter im Klassenraum)
Lehrer: Na gut. Dann eben FAKU.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 14:15
Delphi-Quellcode:
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;
Dein Compiler gibt da nicht zufällig eine Warnung aus, bezüglich "Result sei nicht initialisiert"
(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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#10

AW: Revision; result überschreiben

  Alt 8. Nov 2013, 14:35
PS: Seit 2009 kannst du auch beruhigt "Fakulität" schreiben.
Wäre aber auch nicht richtig...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz