PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fibonacci Reihe



mario88
20-10-2005, 11:35
Ich möchte in C# mit Hilfe einer Rekursion die Fibonacci-Reihe ausgeben. Natürlich is es kein Problem die einzelnen Werte der Reihe zu berechnen, ich möchte aber die komplette Reihe bis zu einem gewissen Index ausgeben. Natürlich könnte ich um den Funktionsaufruf eine for-Schleife drüberlegen, will ich aber nicht.


public static int fibo(int n)
{
if (n == 0 || n == 1)
return 1;
else
return fibo(n-1) + fibo(n-2);
}

Kann mir da jemand helfen?

Mehlwurm
20-10-2005, 12:12
aber kannst du nicht bei "else" einfach ein printf dazupacken ??

sticky bit
20-10-2005, 12:31
Wenn ich das richtig verstanden habe, soll diese Methode das was sie zurück gibt (oder das was sie bekommt?) einfach in eine Liste pushen. Oder?

Dann mach doch einfach in der Klasse wo die Methode drin ist ein Array von ints als Member und leg das dort ab.

Du musst natürlich wissen wann Du den Array wieder "zurücksetzen" musst (also beim "ersten" Aufruf der Methode (der der halt als letzter zurück kehrt, weisst schon was ich meine)).
Vielleicht machst Du es einfach so, das man die Methode nicht direkt aufrufen kann (also nicht public) sondern dem Objekt über ne set-Methode die Zahl übergeben muss und dann im Zuge dieser Set-Methode der Array zuerst zurückgesetzt und dann der neue erstellt wird.
Wäre das ne Möglichkeit? Oder muss die Liste ein Return Wert einer Methode sein die die Zahl übergeben bekommt? Wenn ja, dann versuch aus das ganze iterativ darzustellen, dann geht das auch...

Joghurt
20-10-2005, 12:34
Definiere doch einfach ein Array mit 100 Einträgen, fülle die ersten beiden mit 1 und lasse dann eine for-schleife drüber
for(n=2 ; n<100 ; n++) fib_array[n] = fib_array[n-1] + fib_array[n-2](Kann sein, dass das kein gültiges PHP ist, hab schon ewig kein PHP mehr geschrieben.

7.e.Q
24-10-2005, 06:26
Definiere doch einfach ein Array mit 100 Einträgen, fülle die ersten beiden mit 1 und lasse dann eine for-schleife drüber
for(n=2 ; n<100 ; n++) fib_array[n] = fib_array[n-1] + fib_array[n-2](Kann sein, dass das kein gültiges PHP ist, hab schon ewig kein PHP mehr geschrieben.

Wenn du jetzt noch ein $ vor die Variablen schreibst, ist das richtig so. :)

Joghurt
24-10-2005, 14:20
Wenn du jetzt noch ein $ vor die Variablen schreibst, ist das richtig so. :)Wenn du mir jetzt noch erklärst, warum ich auf eine C#-Frage mit PHP-Code antworte, bin ich glücklich :o

mario88
25-10-2005, 16:50
Danke für die Antworten, hat mir auf jeden Fall geholfen, hier mein Code:


using System;

class Fibonacci
{
private int[] fibarray;

private int fibo(int n)
{
if (n == 0)
{
this.fibarray[0] = 0;
return 0;
}
if (n == 1)
{
this.fibarray[1] = 1;
return 1;
}
else
{
this.fibarray[n] = (fibo(n-1) + fibo(n-2));
return fibarray[n];
}
}

public void calcFibo(int x)
{
this.fibarray = new int[x+1];
for (int i=0; i<this.fibarray.Length; i++)
this.fibarray[i] = 0;
this.fibo(x);
}

public void showFibo()
{
Console.WriteLine("Fibonacci-Reihe: ");
Console.WriteLine("--------------------------");

for (int i=0; i<this.fibarray.Length; i++)
Console.Write(this.fibarray[i] + " ");
}


static void Main()
{
int answer = 0;
Console.Write("Bis zu welcher Stelle: ");
answer = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Calculating...");
Console.Write("\n");
Fibonacci f1 = new Fibonacci();
f1.calcFibo(answer);
f1.showFibo();
Console.Write("\n");
Console.Write("\n");
Console.WriteLine("Done!");

Console.Read();
}
}

Joghurt
26-10-2005, 18:06
Aber wenn du eh schon die Werte in einem Array speicherst, kannst du dir die Rekursion getrost schenken! Rekursiv hat Fib nämlich O(N^2), mit Speichern im Array nur O(N).

dra
28-10-2005, 16:36
aber kannst du nicht bei "else" einfach ein printf dazupacken ??

Das wuerde ich jetzt nicht tun! ;) Mit einem anderen Algorithmus zur Berechnung der Fibonacci-Zahlen wuerde das gehen. Mit diesem Algorithmus jedoch werden alle Werte bis auf fib(n) und fib(n-1) mehrfach (ja, viel zu haeufig) ausgegeben.

Gruss,
dra