Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Probleme mit Rekursiven Fibonacci Algo


F34r0fTh3D4rk - Fr 12.08.05 15:59
Titel: Probleme mit Rekursiven Fibonacci Algo
Hallo, ich wollte gerade einen Rekursiven Fibonacci Algo schreiben (aus reiner langeweile), zuerst bekam ich immer nur das erste ergebnis, dann gar nischt mehr, die ausgabe ist ein problem, aber eigentlich müsste das doch so funktionieren, denn ich denke, dass der denkansatz korrekt ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure fibonacci(it, last, curr: integer; str: string);
var
  next: integer;
begin
  if it > 0 then
    begin
      next := last + curr;
      str := str + inttostr(next);
      if it > 1 then
        str := str + ', '
      dec(it);
      fibonacci(it, curr, next, str);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  str: string;
begin
  fibonacci(1001, str);
  edit1.text := str;
end;


Moderiert von user profile iconTino: Titel überarbeitet.


LigH - Fr 12.08.05 16:17

Mal so ohne tiefere Prüfung:

Wer einen Parameter (str) nicht als "var" deklariert, der wird ihn nie verändert zurückbekommen (außer es ist schon ein Pointer oder Objekt).


F34r0fTh3D4rk - Fr 12.08.05 16:35

HÄ ! jetzt geht das, aber warum ging das vorher nicht ?, ich dachte das sind schon variablen ??? so geht's:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure fibonacci(it, last, curr: integer; var str: string);
var
  next: integer;
begin
  if it > 0 then
    begin
      next := last + curr;
      str := str + inttostr(next);
      if it > 1 then
        str := str + ', '
      dec(it);
      fibonacci(it, curr, next, str);
    end;
end;

sind das dann da oben automatisch konstanten oder wie :shock: :? :?:


zemy - Fr 12.08.05 16:41


Delphi-Quelltext
1:
procedure foo(bla:string);                    

Bla wird als kompletter String übergeben, das bedeutet in einen neuen Speicherbereich geschrieben. Procedure beendet-> String weg


Delphi-Quelltext
1:
procedure foo(var bla:string);                    

Hier arbeitest du mit dem originalen String, mit dem du die Procedur aufgerufen hast. Änderungen bleiben erhalten.


Delphi-Quelltext
1:
procedure foo(const bla:string);                    

wie bei var, nur kannst du hier nix verändern. (ReadOnly)

Vieleicht nicht 100%-korrekt beschrieben, hoffe aber das es ungefähr trifft ;)

MfG Zemy


F34r0fTh3D4rk - Fr 12.08.05 18:10

mir ist auch gerade in den sinn gekommen, dass es ja keine variablen sind, sondern parameter, die innerhalb der prozedur veränderlich sind, nach außen hin aber konstant, von außen aber wieder variable, deshalb kann man konstanten und variablen übergeben, ansonsten nur eines von beiden. :idea:


BingoBongo - Fr 30.09.05 03:15

wenn der rekursive Algorithmus nicht so einfach klappen will, wie du willst, dann nimm doch einfach den expliziten Algo. Wie der genau lautet findet man bei ner suche in der wikipedia. Ich habe mal mit der entsprechenden Gleichung meine Mathelehrerin sehr überraschen können, als ich die angewandt habe.

Freilich gilt das nur, wenn du nicht unbedingt das ganze rekursiv lösen willst.

Bingo


F34r0fTh3D4rk - Fr 30.09.05 07:04

es ging mir ja garnet um den fibonacci algo sondern um rekursion.
der code funzt übrigens, war nur ein var zu wenig ;)