tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
2924
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Ich habe mir für eine rekursive Fakultäts-Rechnung folgendes überlegt.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    x, result: Real;
    ...
    function TRechenoperationen.Fakultaet(x: Real): Real;
    var n: Real;
    begin
    if x >= 2 the begin
       n := x-1;
       result := Fakultaet(n) * x;
      end
    else result := 1;
    end;

    Nur hat result am Ende keinen Wert. Wie kann ich das ändern?
     

  2. #2
    Avatar von Alex Duschek
    Alex Duschek Alex Duschek ist offline I AM AWESOME
    Registriert seit
    Apr 2004
    Ort
    Bartholomä (Baden-Württemberg)
    Beiträge
    514
    Du hast ganz oben in deinem Code "result" deklariert. Das ist aber unnötig (und verursacht wohl auch den Fehler), weil "result" der Rückgabewert deiner Funktion ist. Du brauchst es nicht extra deklarieren. Ansonsten seh ich jetzt keinen Fehler, hab den Code allerdings nur im Kopf getestet
     
    Softwareentwickler

    Sehr gute Kenntnisse: Delphi, Java
    Gute Kenntnisse: PHP, ADA
    Grundkenntnisse: C/C++, C#, JavaScript

  3. #3
    Avatar von Navy
    Navy Navy ist offline Freiwillige Serverwehr
    tutorials.de Administrator
    Registriert seit
    Jul 2003
    Ort
    Montreal (Quebec)
    Beiträge
    1.667
    Es ist im übrigen ungünstig den Rückgabewert in einer Funktion mehr als einmal zu definieren, auch wenn bei einer Anweisungsüberdeckung dieses nur einmal passiert. Sauberer und schöner ist es, wenn man eine (lokale!) Variable definiert und dann ganz zum Schluss den Rückgabewert setzt.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    function TRechenoperationen.Fakultaet(x: integer): integer;
    var TempResult: integer;
    begin
      if x >= 2 then 
      begin
        TempResult := Fakultaet(x-1) * x;
      end
      else
        TempResult := 1;
      result := TempResult;
    end;

    Die globalen Variablen brauchst Du nicht. Darüber hinaus ist die Fakultät < 0 nicht möglich.
    Geändert von Navy (20.10.08 um 11:26 Uhr)
     
    Navy

    --
    Echtzeithilfe unter irc.tutorials.de #tutorials.de

  4. #4
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    habe es so probiert, wie du gesagt hast, navy, gibt er bei der Ergebnisvariable immer 0 aus.
    Warum?
     

  5. #5
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von HarryXVI Beitrag anzeigen
    habe es so probiert, wie du gesagt hast, navy, gibt er bei der Ergebnisvariable immer 0 aus.
    Warum?
    Keine Ahnung. Ich habe auch navys Source getestet und er funktioniert einwandfrei.
     

  6. #6
    Avatar von Navy
    Navy Navy ist offline Freiwillige Serverwehr
    tutorials.de Administrator
    Registriert seit
    Jul 2003
    Ort
    Montreal (Quebec)
    Beiträge
    1.667
    Das Ergebnis 0 kann bei meiner Lösung nicht entstehen. Das Fehler liegt also bei Dir. Hast Du Dich vielleicht irgendwo verschrieben?
     
    Navy

    --
    Echtzeithilfe unter irc.tutorials.de #tutorials.de

  7. #7
    Avatar von squeaker
    squeaker squeaker ist offline Mitglied Platin
    Registriert seit
    Jun 2004
    Ort
    Würzburg
    Beiträge
    577
    Zitat Zitat von Navy Beitrag anzeigen
    Es ist im übrigen ungünstig den Rückgabewert in einer Funktion mehr als einmal zu definieren, auch wenn bei einer Anweisungsüberdeckung dieses nur einmal passiert. Sauberer und schöner ist es, wenn man eine (lokale!) Variable definiert und dann ganz zum Schluss den Rückgabewert setzt.
    Frage - warum ist das ungünstig? Schliesslich legt Delphi ja gerade eine spezielle lokale Variable an um das Resultat dann zu übergeben (die immer den Namen Result hat).

    Beispiel:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    function doSomething : Integer;
    begin
       Result:=ERROR_CODE; //mit Fehlerhaft initialisieren
       //defensives Programmieren, Preconditions pruefen
       if cond1 = true then Exit;
       if cond2 = true then Exit;
       //Preconditions erfuellt
       ...
       Result:=...  //Erfolgreich berechnet
    end;

    wichtig ist doch blos, dass Result einen definierten Wert hat, bevor die Funktion verlassen wird (wie auch immer sie verlassen wird).
     

  8. #8
    Avatar von Alex Duschek
    Alex Duschek Alex Duschek ist offline I AM AWESOME
    Registriert seit
    Apr 2004
    Ort
    Bartholomä (Baden-Württemberg)
    Beiträge
    514
    Also ich setz die Rückgabe normal als erstes auch auf falsch und erst am Schluss, wenn alles funktioniert hat, auf true
     

  9. #9
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    function TRechenoperationen.Fakultaet(x: Integer): Integer;
    var i: Integer;
        TempResult: Integer;
    begin
    if x <= 0 then TempResult := 0 else TempResult := 1;
    for i := 2 to x do begin
      TempResult := TempResult * i;   //eröhhen + und mit vorherigem multiplizieren
      result := TempResult;
      end;
    end;

    Diese Lösung habe ich in meinem Schulbuch gefunden
     

  10. #10
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    Hi,

    diese Lösung ist allerdings nicht rekursiv...

    LG
     
    Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.

Ähnliche Themen

  1. Fakultät für 100 berechnen
    Von Neuling 765 im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 19.01.10, 16:02
  2. Antworten: 11
    Letzter Beitrag: 17.03.06, 16:14
  3. Fakultät
    Von pulmoll im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 29.04.04, 16:37
  4. Fakultät mit Turbopascal berechnen
    Von Xeal87 im Forum Sonstige Sprachen
    Antworten: 11
    Letzter Beitrag: 06.11.03, 18:29
  5. Fakultät im Java Pseudocode berechnen
    Von MS[shady] im Forum Java
    Antworten: 10
    Letzter Beitrag: 11.09.03, 07:28