0 Daumen
683 Aufrufe

Aufgabe:

Schreiben Sie eine Funktion in C mit der die n-te -Zahl berechnet werden kann.

Folge: 5, 3, 8, 11, 19, 30, 49.... usw.

Problem/Ansatz:

Ich wollte die Schleife in C so machen:

#include<stdio.h> 
int fin(int n)
{
if (n <= 5)
{
    return n;
}
return fin(n-1) + fin(n-2);
}

Ich weiß nicht ob ich hier richtig bin. Aber ich bekomme es einfach nicht hin. Bin für einen Tipp dankbar

Avatar von

1 Antwort

0 Daumen
 
Beste Antwort

Aloha :)

long fib( unsigned n ) {
   if (n<2) return 1L;
   return fib(n-1)+fib(n-2);
}

Das liefert:

fib(0)=1 ; fib(1)=1 ; fib(2)=2 ; fib(3)=3 ; ...

Avatar von 148 k 🚀

Danke für den Input. Ich möchte aber wenn ich im Code z.b 1 Eingebe ich die Zahl 5 erhalte. Wenn ich 2 Eingebe sollte ich 3 erhalten, wenn ich 3 eingebe sollte ich 8 erhalten usw... Also immer die Summer der zwei letzten Zahlen.... So wie die Zahlen oben praktisch sind

Die Zahlen oben sind aber in der falschen Reihenfolge. Die Fibonacci-Folge ist:

1,1,2,3,5,8,13,...

Schau mal bitte nach, ob du das nicht vielleicht falsch notiert hast.

Die beiden Startzahlen musst du den Eingabewerten 1 bzw. 2 fest zuordnen.

Erst ab 3 kannst du die Zahlen rekursiv berechnen.

Wenn exakt die von dir angegebene Folge herauskommen soll, musst du wie folgt programmieren:

long func( unsigned n ) {

    if (0==n) return 5L;

    if (1==n) return 3L;

    return func(n-1) + func(n-2);

}

Das liefert:

f(0)=5 ; f(1)=3 ; f(2)=8 ; f(3)=11 ; f(4)=19 ; ...

Die Zahlen oben sind aber in der falschen Reihenfolge. Die Fibonacci-Folge ist:

Die Fragestellerin hat nie behauptet, dass es sich um die F-Folge handelt.

Ja, aber sie hat die Funktion mit "fin" bezeichnet, was jeder gute Programmierer mit "FIbonacci N" interpretieren würde. Aber du hast natürlich recht, weshalb ich ja auch noch eine extra Funktion gepostet habe, die exakt die Folge der Fragenstellerin ausgibt ;)

@Tschakabumba: Vielen Dank es funktioniert

Sehr gerne...

Du kannst die Funktion vielleicht noch optimieren, wenn du "unsigned long" als Rückgabewert einsetzt. Aber "unsigned long" kann zu unangenehmen Überläufen führen, wenn es mit vorzeichenbehafteten Integer-Typen in einer Formel verrechnet wird. Da muss man bei den Compiler-Optionen "-Wall" einstellen, damit der Compiler darauf hinweist. Daher habe ich sicherheitshalber nur "long" als Rückgabewert verwendet.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community