Java-Problem: Ausgabe von Ergebnis einer rekursiven Methode

Hallo!
Bin ein ziemlicher Anfänger in Sachen Java…habe eben ein Methode zur Ermittlung einer Fibonaccireihe in rekursiver Form geschrieben:

public class fibo2 {

static int fib2(int n){

if(n==0) return 0;
if(n==1) return 1;

else return(fib2(n-1)+fib2(n-2));
}
}

Nun will ich irgendwo einen Befehl einbauen, der mir das Ergebnis von fib2(n) auf der Konsole ausgibt, aber wenn ich irgendwo System.out.println() versuche einzubauen (das ist leider der einzige Befehl zur Ausgabe, den ich kenne) erzeuge ich massenhaft Fehler.
Wenn die Methode nach all ihren Durchläufen ein Ergebnis für fib2(n) erhält, von wo aus kann ich dieses weiter verwenden? Und wie kann ich das Ergebnis auf der Konsole ausgeben? Ich gehe stark davon aus, dass mein mangelndes Wissen über Klassen und Methoden der Auslöser für dieses Problem ist :frowning:
Vielen Dank schonmal!

Hi TenaciousT,

so sollte deine Klasse aussehen:

public class fibo2 {

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

public static void main(String[] args) {
int ergebnis = fib2(10);
System.out.println(ergebnis);
}
}

Mit der Variablen „ergebnis“ kannst du weiterarbeiten, zum Beispiel ausgeben wie hier. Statt der 10 kann natürlich jeder andere Wert verwendet werden. Was für Fehlermeldungen bekommst du?
Schöne Grüße, Keks

PS: Klassennamen sollte man grundsätzlich groß schreiben (also Fibo2, statt fibo2)

Vielen Dank!

Jetzt funktioniert es!

Vielen Dank auch für den Tipp mit den Klassennamen!

grundsätzlich kannst du das ergebnis überall verwenden. System.out´s kannst du überall verwenden, wenn du vorher noch nicht returned hast.- entsprechende Klammersetzung vorrausgesetzt-

class fibo2 {

public static void main(String[] args) {
int input = 15;
int result = fib2(input);
System.out.println(result);
JOptionPane.showMessageDialog(null, "Fibonacci von " + input + " ist "

  • result, „Fiboacci“, JOptionPane.INFORMATION_MESSAGE);
    }

static int fib2(int n) {
if (n == 0) {
System.out.println();
return 0;

}
if (n == 1) {
System.out.println();
return 1;
}

else {
System.out.println();
return (fib2(n - 1) + fib2(n - 2));
}
}
}

Sorry, bin gerade im Umzugsstress und habe dementsprechend leider keine Zeit.

Hallo,

du musst in die main()-Methode den Rückgabewert ausgeben. Das funktioniert so:

public static void main(String[] args) {

System.out.println(fib2(n));

}

Das sollte funktionieren. Wenn nicht, poste bitte deinen gesamten Quellcode und vor allem die Fehlermeldungen.

Viele Grüße

Da du mir die Fehlermeldungen nicht geschrieben hast, hier ein funktionierendes beispiel auf Grundlage deines Codes:

public class fibo2 {

 static int fib2(int n) {
 int output = 0;
 if (n==0) {
 output = 0;
 }
 else if (n==1) {
 output = 1;
 }
 else {
 output = fib2(n-1) + fib2(n-2);
 }
 System.out.print("n = "); 
 System.out.print(n);
 System.out.print(", return "); 
 System.out.println(output);
 return output;
 }

 public static void main(String[] args){ 
 System.out.println("Die zwanzigste Fibonacci-Zahl ist:");
 System.out.println(fib2(20));
 } 

}

Zunächstmal habe ich eine neue lokale variable eingeführt, damit es nur ein return gibt. Das wird als guter Programmierstil angesehen, da die Methode immer bis zum Ende durchläuft. Außerdem kann ich das Zwischenergebnis vorher ausgeben. Außerdem habe ich die „Sicherheitsklammern“ um die bedingten Anweisungen ergänzt, um "dangling else"s zu vermeiden.
Nachdem die Methode fib2() aufgerufen wurde, gibt sie einen Wert zurück. Diesen kann man lesen wie eine Variable (siehe main-Methode). An der Reihenfolge der Ausgaben kannst du erkennen, wie erst fib2 rekursiv aufgerufen wird, bevor das Ergebnis tatsächlich ankommt.
Hierbei geht es gar nicht so viel um Klassen und deren Methoden, sondern vielmehr um Programmstruktur mit rekursiven Funktionsaufrufen (bzw. in der objektorientierten Java-Welt spricht man von Methodenaufrufen).
Da ich nicht weiß, welche Entwicklungsumgebung du verwendest, kompiliere ich diese Quellen mit dem Befehl

javac fibo2.java

und starte das Programm mit

java fibo2

.

Hallo!

Wie viele Klassen hast du denn? Um deine Methode nämlich aufrufen zu können, brauchst du iwo auch eine main-Methode von der aus dein Programm aufgerufen wird.

Da kannst du dann n berechnen lassen, ausgeben und weiterverwenden.

LG,
EV*A

In einer Rekursion kann man genauso Ausgaben machen wie in jeder anderen Funktion.

Natürlich darf das System.out.println() nicht nach den returns stehen sondern sollte vorher (vor den if … ) ausgeführt werden.

Ich vermute auch, das „mangelndes Wissen über Klassen und Methoden der Auslöser für dieses Problem ist.“, Deswegen fange ich bei den Grundlagen an:

Stell dir vor du möchtest ein Auto bauen. Dann könnte man folgendes sagen:
* Die Klasse Auto ist ein Bauplan für ein Auto
* Objekte sind die tatsächlichen Autos:

Auto meinAuto = new Auto();

* Methoden teilen sich in zwei Bereiche
** Prozeduren: Sie manipulieren den Zustand des Objektes und haben Rückgabewert (bzw Pseudorückgabewert void)
** Funktionen: Sie haben einen Rückgabewert und können z.B. etwas über den Zustand des Objekte aussagen.
Ein Prozedur könnte z.B sein: public void FahreGeradeAus(). Sie verändert den Zustand des Objektes von stillstehend zu fahrend.
Ein Funktion könnte sein: public bool StehtAutoStill(). Sie liefert dir Informationen über den Fahrtzustand.

Bsp:

Auto myCar = new Auto();
Auto yourCar = new Auto();

Wenn ich wissen möchte ob ein das ein Objekt vom Typ Auto in Bewegung ist, dann müsste ich in etwa folgendes fragen:

bool inBewegung = myCar.StehtAutoStill();
yourCar.FahreGeradeAus();
bool inBewegung2 = !yourCar.StehtAutoStill();

Diese Funktionen sind Instanzemethoden, d.h. sie sind abhängig von dem Objekt welches ich abfrage. So würde im ohrigen Beispiel inBewegung false sein, inBewegung2 jedoch true.

Statische Methoden haben hier eine besondere Bedeutung: Sie haben keinen Bezug zum konkreten Objekt/Instanz. Das bedeutet sie sind für alle Objekte der Klasse gleich. Man könnte z.B wissen wollen, ob ein Typ (Typ == Klasse) ein Fortbewegungsmittel ist, dann würde man folgendes definieren:

public static bool IsFortbewegungmittel(){
 return true;
}

Da alle Objekte vom Typ Auto Fortbewegungsmittel sind, ist diee Eigenschaft nicht vom Konkreten Objekt myCar oder yourCar abhängig, sondern vom Typ. Deswegen wird diese Methode auch Typenabhängig abgefragt:

bool istFortbewegungsMittel = Auto.IsFortbewegungmittel();

Kommen wir nun zu deinem Problem:
Du hast einen Typ fibo2 definiert, der eine statische Methode static int fib2(int n) besitzt. Statische Methode bedeutet, dass du die Methode fib2 nicht über einen Instanz, sondern über den Typ aufrufst:

int fib = fibo2.fib2(5);
System.out.println(gib);

Diesen Aufruf kannst du z.B der Methode

static void main(string args)

unterbringen. Dies ist der Einstiegspunkt eines Java-Programm. Dann sollte auch alles klappen.

PS diese Beispiel ist nur für blutige Anfänger geeignet, da die Erklärung so stark vereinfacht ist, dass Sie für Fortgeschrittene zu ungenau ist.

Hallo,

System.out.println ist die korrekte Methode für Konsolenausgabe, du musst lediglich das Ergebnis deiner Fibonacci Methode entsprechend ausgeben, z.B.

public class fibo2 {

 public static void main(String[] args) {

 int n = 42;
**System.out.println("Fibo " + n + ": " + fib2(n));**
 }

 static int fib2(int n){

 if(n==0)
 return 0;
 if(n==1)
 return 1;
 else
 return(fib2(n-1)+fib2(n-2));
 }
} 

Gruß
Heavy

Hallo,
leider kann ich Dir bei diesem Problem nicht mehr helfen.
Erstens weiss ich gar nicht was das ist „eine Fibonaccireihe in rekursiver Form“ und zweitens ist mein Java wissen eingeschlafen da ich mittlerweile Papa von 2 Jungs bin und keine Zeit mehr für Java habe.
Tut mir leid :frowning:
Mit freundlichem Gruß
Ingo