Fibonacci Folge in C

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Gerowia
Beiträge: 14
Registriert: Di Jan 03, 2017 10:38 am

Fibonacci Folge in C

Beitrag von Gerowia » Di Jan 03, 2017 10:45 am

Hallo,
ich soll im Rahmen meines Studiums ein Programm in C schreiben, das Fibonacci Zahlen ab der F5 bis F30 in Fünferschritten ausgibt und stehe auf dem Schlauch wie ich das anstellen soll...

Hier was ich bisher habe:

Code: Alles auswählen

#include<stdio.h>

int fib(int n)
{ 
	while (n<=30)
	 {return fib(n-1)+fib(n-2);
	  }
}
int main(void)
{int n;
n=5;
fib(n);
while(n<=30)
{
printf("Die Fibonacci-Zahl F%i ist = %i \n ",n, fib(n));
n=n+5;}
return 0;
}
ist für erfahrene Programmierer bestimmt leicht, aber ich komme einfach nicht weiter, wäre sehr für Tipps dankbar :cry:

Edit by cloidnerux: Code-tags

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fibonacci Folge in C

Beitrag von cloidnerux » Di Jan 03, 2017 11:21 am

Hallo und Willkommen im Forum :D
ich soll im Rahmen meines Studiums ein Programm in C schreiben, das Fibonacci Zahlen ab der F5 bis F30 in Fünferschritten ausgibt und stehe auf dem Schlauch wie ich das anstellen soll...
Ich nehme mal an, dass F5 für die fünfte Zahl in der Fibonacci Reihe steht und dein Programm F5, F10, F15, F20, F25 und F30 ausgeben soll.

Dein Hauptptoblem liegt in deiner Funktion "fib", die nicht die Fibonacci Folge zurück gibt.

Code: Alles auswählen

int fib(int n)
{ 
    while (n<=30)
    {
        return fib(n-1)+fib(n-2);
    }
}
Schau dir dazu mal den Beitrag in unserem Tutorial an:
https://www.proggen.org/doku.php?id=c:t ... :recursion
Gruß
cl
Redundanz macht wiederholen unnötig.
quod erat expectandum

Gerowia
Beiträge: 14
Registriert: Di Jan 03, 2017 10:38 am

Re: Fibonacci Folge in C

Beitrag von Gerowia » Di Jan 03, 2017 12:16 pm

Danke =)
Also ehrlich gesagt, habe ich mir das bereits durchgelesen und dort steht ja auch
" return fibonacci_intern( fib-1 ) + fibonacci_intern( fib-2 );"
, ich bin davon ausgegangen, die Funktion für Werte unter 2 nicht definieren zu müssen, da es ja erst bei der Fibonacci-Zahl 5 beginnen soll .. hmm

Habe es zwischenzeitlch abgeändert in :

Code: Alles auswählen

#include<stdio.h>

int fib(int n)
{ 
    int ergebnis;
	while (n<=30)
    { 
		ergebnis= (n-1)+(n-2);
		n=n+5;
		return ergebnis;
    }
}

int main(void)
{
	int n, ergebnis;
	n=5;
	fib(n);
	while(n<=30)
	{
		printf("Die Fibonacci-Zahl F%i ist = %i \n ",n, fib(ergebnis));
		n=n+5;
	}
	return 0;
}
Jetzt stürzt es zwar nicht mehr ab, aber liefert als ergebnis für F5 bis F30 jeweils -1 :?
Edit by cloidnerux: Code-Tags und Formatierung

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fibonacci Folge in C

Beitrag von cloidnerux » Di Jan 03, 2017 1:20 pm

Bitte nutze für Code den "Code-Tag", damit ist es übersichtlicher zu lesen.
Also ehrlich gesagt, habe ich mir das bereits durchgelesen und dort steht ja auch
" return fibonacci_intern( fib-1 ) + fibonacci_intern( fib-2 );"
, ich bin davon ausgegangen, die Funktion für Werte unter 2 nicht definieren zu müssen, da es ja erst bei der Fibonacci-Zahl 5 beginnen soll .. hmm
Der Computer und der Compiler besitzen keine Intelligenz, man kann fast sagen, dass diese wunderwerke der Technik unheimlich dumm sind. Sie machen nur genau das, was du programmiert hast. Sie machen aber nicht das, was du möchtest. Daher musst du genau darauf achten, dass das was du Programmierst auch das ist, was du willst.

Weiterhin ist die Funktion über den Wertebereich der Eingangsvariablen definiert, aber es kommt nicht immer etwas sinnvolles dabei heraus.
Schauen wir uns doch mal deine Funktion an:

Code: Alles auswählen

int fib(int n)
{ 
    int ergebnis;
   while (n<=30)
    { 
      ergebnis= (n-1)+(n-2);
      n=n+5;
      return ergebnis;
    }
}
Du hast dort ein "while(n <= 30)", dies gehört aber nicht in eine Funktion, die Fibonacci zahlen berechnet. Die Schleife wird zudem auch nur ein mal ausgeführt, da mit dem "return ergebnis" die Funktion beendet wird. Gibst du z.B n = 5 hinein, erhälst du 4+3=7 als Ergebnis, dies ist aber nicht eine Fibonacci Zahl.
Wenn du dir das Tutorial nochmal genau durchliest, siehst du, dass der Code für die Fibonacci Folge wie folgt aussieht:

Code: Alles auswählen

unsigned int fibonacci( unsigned int fib )
{
  if     ( fib == 0 ) return 0;
  else if( fib == 1 ) return 1;
  else                return fibonacci( fib-1 ) + fibonacci( fib-2 );
}
Es gibt weder ein while noch eine Variable, sondern es wird über Rekursion gearbeitet. Der entscheidende Schritt ist aber, dass du eine Abbruchbedingung für die Rekursion hast, nämlich genau dann, wenn du die nullte oder erste Fibonacci-Zahl haben möchtest.


Im weiteren passt dein Code, wobei du statt einem "while" auch eine for-Schleife verwenden kannst.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Gerowia
Beiträge: 14
Registriert: Di Jan 03, 2017 10:38 am

Re: Fibonacci Folge in C

Beitrag von Gerowia » Di Jan 03, 2017 2:05 pm

Achso ok, dann denke ich wohl einfach noch falsch , wenn es ums Programmieren geht ;)
Tut mir auch Leid für all die Fragen, aber das ist erst mein drittes Programm, obendrein das erste mit Unterfunktion und dazu noch einer rekursiven ;)
Ich habe es jetzt wie folgt abgeändert:

Code: Alles auswählen

#include<stdio.h>

int fib(int n)
{ if (n == 0) return 0;
  else if (n==1) return 1;
  else return fib(n-1)+fib(n-2);
     }
   
int main(void)
{int n, ergebnis;
n=5;
fib(n);
while(n<=30)
{
printf("Die Fibonacci-Zahl F%i ist = %i \n ",n, fib(n));
n=n+5;
}
return 0;
}
Nun wird die Funktion auch mehrmals durchlaufen (ich erhalte also verschieden Ergebnisse, die auch mit F bis F30 deklariert werden).
Jedoch sind diese leider falsch, so erhalte ich z.B. für F5 = 5 :cry:
Also scheine ich mal wieder etwas übersehen oder falsch verstanden zu haben..
Vielen Dank dir schonmal für all die Hilfe :)

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fibonacci Folge in C

Beitrag von cloidnerux » Di Jan 03, 2017 2:46 pm

Ich habe deinen Code nicht stark verändert, nur etwas Transparenter gemacht:

Code: Alles auswählen

#include<stdio.h>

int fib(int n)
{ 
	if (n == 0) return 0;
	else if (n==1) return 1;
	else return fib(n-1)+fib(n-2);
}
   
int main(void)
{
	int n = 5;
	for(int i = 1; i < 30; i++)
	{
		printf("Die Fibonacci-Zahl F%2i ist = %i \n",i, fib(i));	
	}
	/*while(n<=30)
	{
		printf("Die Fibonacci-Zahl F%2i ist = %i \n",n, fib(n));
		n=n+5;
	}*/
	return 0;
}
Das Ergebnis ist:

Code: Alles auswählen

Die Fibonacci-Zahl F 1 ist = 1
Die Fibonacci-Zahl F 2 ist = 1
Die Fibonacci-Zahl F 3 ist = 2
Die Fibonacci-Zahl F 4 ist = 3
Die Fibonacci-Zahl F 5 ist = 5
Die Fibonacci-Zahl F 6 ist = 8
Die Fibonacci-Zahl F 7 ist = 13
Die Fibonacci-Zahl F 8 ist = 21
Die Fibonacci-Zahl F 9 ist = 34
Die Fibonacci-Zahl F10 ist = 55
Die Fibonacci-Zahl F11 ist = 89
Die Fibonacci-Zahl F12 ist = 144
Die Fibonacci-Zahl F13 ist = 233
Die Fibonacci-Zahl F14 ist = 377
Die Fibonacci-Zahl F15 ist = 610
Die Fibonacci-Zahl F16 ist = 987
Die Fibonacci-Zahl F17 ist = 1597
Die Fibonacci-Zahl F18 ist = 2584
Die Fibonacci-Zahl F19 ist = 4181
Die Fibonacci-Zahl F20 ist = 6765
Die Fibonacci-Zahl F21 ist = 10946
Die Fibonacci-Zahl F22 ist = 17711
Die Fibonacci-Zahl F23 ist = 28657
Die Fibonacci-Zahl F24 ist = 46368
Die Fibonacci-Zahl F25 ist = 75025
Die Fibonacci-Zahl F26 ist = 121393
Die Fibonacci-Zahl F27 ist = 196418
Die Fibonacci-Zahl F28 ist = 317811
Die Fibonacci-Zahl F29 ist = 514229
Wie du siehst, arbeitet der Algorithmus richtig und spuckt dir die Fibonacci Folge heraus, so wie es z.B auch bei Wikipedia aufgeführt ist https://de.wikipedia.org/wiki/Fibonacci-Folge
Es ist nicht immer alles falsch, wenn es nicht den Erwartungen entspricht ;)
Redundanz macht wiederholen unnötig.
quod erat expectandum

Gerowia
Beiträge: 14
Registriert: Di Jan 03, 2017 10:38 am

Re: Fibonacci Folge in C

Beitrag von Gerowia » Di Jan 03, 2017 9:07 pm

Oh stimmt ja, ich habe die Ergebnisse mit der Liste hier auf der Seite verglichen und sie stimmen überein, das hätte ich lieber vorher tun sollen :D
Vielen vielen Dank für all die Hilfe , ich denke ich habe es auch endlich halbwegs verstanden.:)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fibonacci Folge in C

Beitrag von Xin » Mi Jan 04, 2017 12:48 pm

Falls Du das Programm rekursiv gestalten sollst, hast Du Deinen Job damit erledigt.
Ansonsten würde ich Dir raten, die fib-Funktion nochmal iterativ zu schreiben (in einer Schleife statt mit einer Rekursion) und zu vergleichen, was schneller ist und warum.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten