Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fibonacci-Zahlen (iterativ) (https://www.delphipraxis.net/12562-fibonacci-zahlen-iterativ.html)

Piwi 29. Nov 2003 19:46


Fibonacci-Zahlen (iterativ)
 
Hallo Delphi-Gemeinde,

ich habe in diesem Programmtext irgend einen Denkfehler drin, der mir nicht auffallen will. Es geht darum, die Fibonacci-Zahl an der Stelle n in der Fibonacci-Reihe darzustellen.

Fibonacci-Zahlen

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Die nächste Zahl in der Reihe ergibt sich also immer aus der Summe seiner beiden Vorgänger. Rekursiv ist das ganze relativ einfach darzustellen, iterativ wohl auch, aber dort ist ein Denkfehler in meinem Programmtext:

Delphi-Quellcode:
function TForm1.fibonit(n:integer):integer;
var x,y,z,i:integer;
begin
 x:=1;
 y:=1;
 i:=0;
 repeat
 i:=i+1;
 z:=x+y;
 y:=x;
 x:=z;
 until i=(n-1);
end;


procedure TForm1.iterativbuttonClick(Sender: TObject);
var n:integer;
begin
n:=strtoint(edit1.text);
listbox1.items.add(inttostr(fibonit(n)));
end;
Er trägt in die Listbox nach ca. zehnsekündiger Berechnungsphase (!!) eine relativ hohe Zahl ein, selbst wenn ich n=1 wähle. Wo ist der Fehlerteufel? :angle:

DANKE IM VORAUS! :spin:

Kamil 29. Nov 2003 20:04

Re: Fibonacci-Zahlen (iterativ)
 
Bei der Fuktion Fehlt ein Ergebnis (result:=x)

Entweder so:

Delphi-Quellcode:
procedure TForm1.fibonit(n:integer);
var
  x,y,z,i:integer;
begin
  x:=1;
  y:=1;
  listbox1.items.add(inttostr(x));
  listbox1.items.add(inttostr(y));
  i:=0;
  repeat
    i:=i+1;
    z:=x+y;
    listbox1.items.add(inttostr(z));
    y:=x;
    x:=z;
  until i=(n-1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  n: integer;
begin
  n:=strtoint(edit1.text);
  fibonit(n);
end;
oder so:
Delphi-Quellcode:
function TForm1.fibonit(n:integer): integer;
var
  x,y,z,i:integer;
begin
  x:=1;
  y:=1;
  i:=0;
  repeat
    i:=i+1;
    z:=x+y;
    y:=x;
    x:=z;
  until i=(n-1);
  result:=z;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  n: integer;
begin
  n:=strtoint(edit1.text);
  listbox1.items.add(inttostr(fibonit(n)));
end;

sharkx 29. Nov 2003 20:21

Re: Fibonacci-Zahlen (iterativ)
 
Zitat:

Zitat von Kamil
Bei der Fuktion Fehlt ein Ergebnis (result:=x)

Entweder so:

Delphi-Quellcode:
procedure TForm1.fibonit(n:integer);
var
  x,y,z,i:integer;
begin
  x:=1;
  y:=1;
  listbox1.items.add(inttostr(x));
  listbox1.items.add(inttostr(y));
  i:=0;
  repeat
    i:=i+1;
    z:=x+y;
    listbox1.items.add(inttostr(z));
    y:=x;
    x:=z;
  until i=(n-1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  n: integer;
begin
  n:=strtoint(edit1.text);
  fibonit(n);
end;
oder so:
Delphi-Quellcode:
function TForm1.fibonit(n:integer): integer;
var
  x,y,z,i:integer;
begin
  x:=1;
  y:=1;
  i:=0;
  repeat
    i:=i+1;
    z:=x+y;
    y:=x;
    x:=z;
  until i=(n-1);
  result:=z;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  n: integer;
begin
  n:=strtoint(edit1.text);
  listbox1.items.add(inttostr(fibonit(n)));
end;



Delphi-Quellcode:
   
    y:=x;
    x:=z;
Wozu? Warum nich gleich y := z; ?

Kamil 29. Nov 2003 20:24

Re: Fibonacci-Zahlen (iterativ)
 
Zitat:

Zitat von sharkx
Delphi-Quellcode:
   
    y:=x;
    x:=z;
Wozu? Warum nich gleich y := z; ?

Weil Fibonacci Zahlen aus den zwei vorherigen Zahlen gebildet werden:

Fib(1)=1
Fib(2)=1
Fib(x)=Fib(x-1)+Fib(x-2)

himitsu 29. Nov 2003 20:37

Re: Fibonacci-Zahlen (iterativ)
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif,

Mit freuntlichen Grüßen von Daniel B und mir:
Fibonacci

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

MCeddy 29. Nov 2003 20:38

Re: Fibonacci-Zahlen (iterativ)
 
Hi Piwi. So eine Aufgabe mit Fibonzahlen hatte ich gestern in meiner Info-Klausur auch drann gehabt. Ich hab das Problem dort mit einem Array gelöst. Hier der Code für Turbo Pascal:

Delphi-Quellcode:
program Fibonacci_Zahlen;

uses
  crt;

const
  MAX = 25;

var
  zahlen : array[0..MAX] of longint;
  i     : integer;

begin
  zahlen[0] := 0;
  zahlen[1] := 1;
  for i := 2 to MAX do
    zahlen[i] := zahlen[i-1] + zahlen[i-2];
  for i := 0 to MAX do
    writeln('fibo(', i, ') = ', zahlen[i]);
  readln;
end.
viele Grüße

MCeddy02
:cheers:

sharkx 30. Nov 2003 07:05

Re: Fibonacci-Zahlen (iterativ)
 
Zitat:

Zitat von Kamil
Zitat:

Zitat von sharkx
Delphi-Quellcode:
   
    y:=x;
    x:=z;
Wozu? Warum nich gleich y := z; ?

Weil Fibonacci Zahlen aus den zwei vorherigen Zahlen gebildet werden:

Fib(1)=1
Fib(2)=1
Fib(x)=Fib(x-1)+Fib(x-2)


Ja aber du tust doch nach dem oberen Code einfach die Variablen bzw deren Result an eine andere Weitergeben. y :=x; x := z; .. Da passiert doch nichts mehr mit addieren, multiplizieren oder sonstwas.

Chewie 30. Nov 2003 08:51

Re: Fibonacci-Zahlen (iterativ)
 
Wenn du genau hinsiehst, wirst du sehen, dass x zu Beginn der Schleife wieder gelesen wird.

MCeddy 30. Nov 2003 12:08

Re: Fibonacci-Zahlen (iterativ)
 
Hi ich bin's nochmal. Habe jetzt mal als meiner Lösung eine Funktion zusammen gebastelt bei der die Fibonacci-Zahlen an der stelle n mit Hilfe von einem Array erzeugt werden können:

Delphi-Quellcode:
function fibonacci(n : byte) : longint;
const
  MAX = 40;
var
  zahlen : array[0..MAX] of longint;
  i     : integer;
begin
  zahlen[0] := 0;
  zahlen[1] := 1;
  for i := 2 to n do
    zahlen[i] := zahlen[i-1] + zahlen[i-2];
  result := zahlen[n];
end;
tschau und noch ein schönes Wochenende allen DP-Usern :zwinker:

MCeddy02
:cat:

himitsu 30. Nov 2003 16:23

Re: Fibonacci-Zahlen (iterativ)
 
http://www.FrankNStein.de/Smiley-Wolke.gif Hallöle,

hier mal eine Version ohne Array und mit Fehlerbehandlung.

Liefert die Fibonacci-Zahlen im Bereich von 0 bis 92 (0 bis 7540113804746346429).

Delphi-Quellcode:
Function Fibonacci(N: Byte): Int64;
  Var I1, I2, Ix: Int64;
    I: Integer;

  Begin
    I1 := 0;
    I2 := 1;
    For I := 1 to N do Begin
      Ix := I1;
      I1 := I2;
      I2 := Ix + I2;
    End;
    If N <= 1 Then Result := N
    Else If N <= 92 Then Result := I1
    Else Result := -1; {Fehler}
  End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 1 von 2  1 2      

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