Frage von Alinchen24, 62

fib in c?

hey leute, mein compiler gibt mir bei der funktion zwar keinen fehler aus aber es funktioniert trotzdem nicht. Könnt ihr mir vllt helfen :) LG Alina

include

include

long fib_rec(long n){

if(n==0){

return 0;

}

if(n==1){

return 1;

}

if(n>=2){

int fib;

fib= fib_rec(n-1) + fib_rec(n-2);

return fib;

}

}

int main(){

int n=0;

int i=0;

for(i=0;i<50;i++){

fib_rec(n);

printf("%i", n);

n++;

}

return 0;

}

Antwort
von Willibergi, 28

Zuerst einmal ein paar grundlegende Dinge:

  • Die Variable n ist nicht nötig, denn dafür ist in einer Schleife die Variable i zuständig, die ohnehin erhöht wird.
  • Die Variable i sollte einen möglichst kleinen Gültigkeitsbereich besitzen und somit im Schleifenkopf definiert und initialisiert werden.
    Also so: for(int i=0; i<50; i++){ ... }
  • In der Funktion fib_rec() sollte für die return-Anweisung keine weitere Variable definiert werden, sie ist unnötig.
    Schreibe einfach: return fib_rec(n-1) + fib_rec(n-2)
  • Es wird wohl kaum die Fibonaccifolge von einer Zahl > ~32.000 benötigt. Deshalb sollte als Übergabeparameter nicht der Datentyp Long, sondern der Datentyp Integer benutzt werden.
  • Die Anweisung if(n >= 2){ ... } ist nicht nötig - sollte n < 2 sein, wird die Funktion durch eine return-Anweisung ohnehin schon vorzeitig verlassen.

Eigentlich sollte dein Code trotz dieser "Unschönheiten" funktionieren - was wird denn ausgegeben?

LG Willibergi

Kommentar von Willibergi ,

EDIT: 

Dein Fehler liegt hier:

fib_rec(n)

Die Fibonacci-Zahl von n wird berechnet und zurückgegeben, verliert sich aber im nichts, weil sie nirgends gespeichert wird.

Deshalb werden dir in der Konsole, nehme ich an, auch nur die Zahlen von 0 bis 49 ausgegeben, oder?

Wenn, dann müsstest du es folgendermaßen machen:

printf("%i", fib_rec(i))

Du könntest auch in der Funktion fib_rec die Werte ausgeben lassen.

Dein Fehler lag also darin, dass der Wert, der durch die Funktion zurückgegeben wurde, nirgends gespeichert wird.

Ich hoffe, ich konnte dir helfen.

LG Willibergi

Kommentar von Alinchen24 ,

naja er gibt jetzt nix mehr aus und beendet auch nicht das programm. (auch nicht wenn ich den code umgeändert habe)

Kommentar von Alinchen24 ,

ok danke hat sich geklärt^^ bei 50 braucht der compiler ewigkeiten :)

Kommentar von Willibergi ,
include
include

long fib(int n){
  if(n == 0 || n == 1) return n;
  return fib(n-1) + fib(n-2);
}

int main(){
  for(int i=0; i<50; i++){
    printf("%ld", fib(i));
  }

  return 0;
}

Hier hab' ich deinen Code noch mal verbessert, damit er sowohl laufzeittechnisch schneller, kürzer und lesbarer wird.

LG Willibergi

Kommentar von Willibergi ,

Ja, das ist das Problem bei rekursiven Funktionen.
Deshalb würde ich eine solche Berechnung auch eher iterativ durchführen.
LG Willibergi

Antwort
von Berny96, 35

Was soll die Funktion denn erreichen?  Was genau wird hier berechnet? 

fib= fib_rec(n-1) + fib_rec(n-2);

Und wieso deklarierst du int i? es wird in der For schleife doch schon gemacht.

Was ist die Ausgabe die du bekommst und wie sollte sie aussehen?

Sicher das du nicht anstatt fib_rec(n), fib_rec(i) aufrufen willst?

Kommentar von Alinchen24 ,

naja in der Funktion die ich gegeben habe stand das er fib(n-1) + fib(n-2) rechnen sollte^^ ausgaben sind 0,1,1,2,3,5,8,13 usw. (Fibonacci Folge) :)

Kommentar von Berny96 ,

Und wie sieht deine Ausgabe aus?

Kommentar von Willibergi ,

Ihre Ausgabe sieht folgendermaßen aus:

012345678910111213141516171819202122232425...

Also alle Zahlen von Null bis 49 aneinandergereiht.

Wo der Fehler liegt, siehe oben.

Antwort
von PerfectMuffin, 15

fib_rec(n);

Da n nur ein call-by-value Parameter ist und in der Funktion fib_rec ohnehin nie geändert wird, tut diese Zeile absolut gar nichts.

Keine passende Antwort gefunden?

Fragen Sie die Community