![]() |
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:
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:
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; DANKE IM VORAUS! :spin: |
Re: Fibonacci-Zahlen (iterativ)
Bei der Fuktion Fehlt ein Ergebnis (result:=x)
Entweder so:
Delphi-Quellcode:
oder so:
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;
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; |
Re: Fibonacci-Zahlen (iterativ)
Zitat:
Delphi-Quellcode:
Wozu? Warum nich gleich y := z; ?y:=x; x:=z; |
Re: Fibonacci-Zahlen (iterativ)
Zitat:
Fib(1)=1 Fib(2)=1 Fib(x)=Fib(x-1)+Fib(x-2) |
Re: Fibonacci-Zahlen (iterativ)
Ein Hallöle von
![]() Mit freuntlichen Grüßen von Daniel B und mir: ![]() http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
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:
viele Grüße
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. MCeddy02 :cheers: |
Re: Fibonacci-Zahlen (iterativ)
Zitat:
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. |
Re: Fibonacci-Zahlen (iterativ)
Wenn du genau hinsiehst, wirst du sehen, dass x zu Beginn der Schleife wieder gelesen wird.
|
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:
tschau und noch ein schönes Wochenende allen DP-Usern :zwinker:
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; MCeddy02 :cat: |
Re: Fibonacci-Zahlen (iterativ)
![]() hier mal eine Version ohne Array und mit Fehlerbehandlung. Liefert die Fibonacci-Zahlen im Bereich von 0 bis 92 (0 bis 7540113804746346429).
Delphi-Quellcode:
http://www.delphipraxis.net/images/common/divider.jpg
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; ![]() ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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