Ich denke ihr behandelt gerade das Thema Rekursion? Aufjedenfall schreibst du gerade ein rekursives Programm. Das funktioniert so: Du nimmst ein großes Problem (Berechnung der 5. Fibonacci Zahl) und führst das "große" Problem auf "kleinere" (Berechnung der 4. und 3. Fib. Zahl) zurück. Das geht solange (rekursiv, d.h. das Programm/die Funktion ruft sich selber wieder auf), bis der sog. Basisfall eintritt. Dann findet kein rekursiver Aufruf mehr statt (d.h. bei uns im Fall n=0 und n=1).
Wir berechnen mal die 5. Fib Zahl. Das würde dann so ausschauen: Fibonacci(5) = Fibonacci(4) + Fibonacci(3) = Fibonacci(3) + Fibonacci(2) + Fibonacci(2) + Fibonacci(1) etc.
Damit das aber klappt, darfst du die "auf dem Weg berechneten" Fibonacci zahlen nicht ausgeben (du kannst natürlich, der Sinn sei aber mal dahingestellt), sondern musst sie an die "aufrufende" Funktion zurückgeben. In Code:
Code:
*beliebige Variable* = Fibonacci($n-1) + Fibonacci($n-2);
return *beliebige Variable*;
oder einfach nur
Code:
return Fib($n-1) + Fib($n-2);
Damit es hier aber überhaupt was zu berechnen gibt, muss "Fibonacci($n-1)" (bzw $n-2) etwas zurückgeben, weil sonst weiß die Funktion ja nicht, was sie addieren soll. Das ist wichtig, sollte dir also definitv klar sein! Frag im Zweifel lieber nochmal nach.
Wie gibt eine Funktion nun etwas zurück? Im (falschen!) Fall "$n <= 2" hast du das ja schon richtig gemacht, nämlich mit "return". "print" ist etwas ganz was anderes, damit gibst du nur etwas auf dem Bildschirm aus, aber du gibst keinen Wert zurück! Die "aufrufende" Funktion weiß dann garnicht, was sie berechnen soll.
Und nochmal zu dem "else" Teil: Den kannst du dir sparen! Bzw. alternativ kannst du dir auch das was danach kommt sparen (was, wenn im "else" Teil ein return stehen würde, eh niemals ausgeführt werden würde. Denk da mal drüber nach!).
Das macht dein Programm zur Zeit in Pseudocode formuliert:
Falls n<=2: Gebe n zurück UND BEENDE HIER. Code der in dieser Funktion danach kommt, wird nicht mehr angeschaut.
Ansonsten: Berechne Fib(n-1) und Fib(n-2) und schmeiß das Ergebnis in den Müll.
"Danach" (wird nur ausgeführt, wenn n>2, s.o.): Berechne Fib(n-1) und Fib(n-2) und GEB DAS ERGEBNIS AUS! Du müsstest es aber ZURÜCK geben!
Hoffe das hilft dir!
Zu deiner if-Abfrage: Wenn n = 0 ist musst du 0 zurückgeben, wenn n=1 ist musst du 1 zurückgeben. Alles andere kannst du berechnen. Realisieren kannst du das, wie du schon richtig erkannt hast, mit if Abfragen.
Und noch ein kleiner Tipp: Über Effizienz mach dir mal keine Gedanken. Gerade wenn du noch lernst achte lieber auf ordentlichen und hübschen Code (Kommentare! Früh übt sich!) der einfach nur das macht, was er soll.
Viel Erfolg!
Matthias