Nicht initialisierte Variable in meinem Fibonacci-Programm

Status
Nicht offen für weitere Antworten.

phrygian

Mitglied
Hallo zusammen!
Das ist mein erster Eintrag in diesem Forum. Ich danke euch schon mal für eure Hilfe.
Ich habe versucht, ein Programm zu schreiben, das mir die n-te Fibonacci-Zahl berechnet. Leider meldet der Compiler folgenden Fehler: Fibonacci.java:18: variable fn might not have been initialized
fn_1=fn;
Mir ist nicht klar, weshalb die Variable nicht initialisiert sein soll. In der while-Schleife setze ich ja fn=fn_1+fn_2, also sollte doch beim ersten Durchlauf fn den Wert 2 erhalten, da ich fn_1 und fn_2 mit 1 initialisiert habe.
Kann mir jemand sagen, wo der Fehler liegt?

Gruß, phrygian

Code:
class Fibonacci
{
    public static void main(String[] args)
    {
        int n=Integer.parseInt(args[0]);
        int i=2;
        int fn; //n-te Fibonacci-Zahl
        int fn_1=1; // (n-1)-te Fibonacci-Zahl; zu Beginn ist sie gleich 1
        int fn_2=1;

        if(n==0 || n==1)
            fn=1;
        else
        {
            while(i<=n)
                fn=fn_1 + fn_2;
                fn_2=fn_1;
                fn_1=fn;
                i += 1;
        }
        System.out.println(fn);
    }
}
 

phrygian

Mitglied
Wildcard hat gesagt.:
Der Fehler ist das 'fn' nicht initialisiert wird wenn die if Bedingung nicht erfüllt wird.

Hallo Wildcard!

Danke für Deine Antwort! Da ich ein Programmieranfänger bin, hilft sie mir leider nicht weiter.
Initialisieren heißt doch, einer Variablen einen Wert zuweisen. Da fn_1 und fn_2 beide initialisiert sind, bin ich davon ausgegangen, daß fn durch die Zuweisung "fn=fn_1+fn_2" den Wert 2 erhält.
Wo liegt der Fehler in meiner Überlegung?
Was muss ich anders machen?
Vielen Dank!

Gruß, phrygian
 

hansch

Mitglied
Überleg dir mal was passiert wenn die angegebene 'Zahl' also args[0] -1 sein sollte...

Da ich jetzt nicht genau weiss wie man die Fibonacci-Zahl berechnet, weiss ich auch nicht ob das der Fehler sein könnte, aber nach deiner Formatierung zu Urteilen könntest du mit
Code:
            while(i<=n)
                fn=fn_1 + fn_2;
                fn_2=fn_1;
                fn_1=fn;
                i += 1;
vielleicht
Code:
            while(i<=n)
            {
                fn=fn_1 + fn_2;
                fn_2=fn_1;
                fn_1=fn;
                i += 1; 
            }
meinen.
lg
 

Wildcard

Top Contributor
Code:
        if(n==0 || n==1)
            fn=1;
        else
        {
            while(i<=n)
                fn=fn_1 + fn_2;
                fn_2=fn_1;
                fn_1=fn;
                i += 1;
        }
Nehmen wir mal an n=-1.
Code:
if(n==0 || n==1)
Trifft nicht zu -> fn nicht initialisiert.
Code:
while(i<=n)
i ist nicht kleiner als n -> fn immer noch nicht initialisiert -> Compilerfehler
 

phrygian

Mitglied
Hallo Wildcard und Hansch!

Danke für Eure Antworten. Jetzt ist mir wenigstens klar, wieso fn nicht initialisiert war. Da das Programm nur für nichtnegative n definiert sein sollte, habe ich den Fall n<0 nicht beachtet.
Ich habe jetzt das Programm umgeschrieben.

Code:
class Fibonacci
{
    public static void main(String[] args)
    {
        int n=Integer.parseInt(args[0]);
        int i=2;
        int fn; //n-te Fibonacci-Zahl
        int fn_1=1; // (n-1)-te Fibonacci-Zahl; zu Beginn ist sie gleich 1
        int fn_2=1;

		if(n<0)
			{
			fn=0; //Ist diese Initialisierung überhaupt nötig?
			System.out.println("Negative Zahlen sind nicht erlaubt!");
			}

		else
			{
        	if(n==0 || n==1)
        		fn=1;
        	else
        		{
				while(i<=n)
                	{
                    fn=fn_1 + fn_2;
                    fn_2=fn_1;
                    fn_1=fn;
                    i += 1;
					    }
				    }
			System.out.println(fn);
			}
	}
}

Der Compiler meldet jetzt aber einen Fehler in Zeile 31: das fn in "System.out.println(fn)" sei nicht initialisiert. Ich verstehe nicht, wieso. :bahnhof:
Ich hoffe, ihr habt noch Geduld mit mir!

Gruß, phrygian
 

Wildcard

Top Contributor
Du verlangst da zuviel vom Compiler. Er weiß nur das diese Schleife
Code:
while(i<=n)
eventuell nicht ausgeführt wird. Wenn das passiert ist fn nicht initialisiert.
Mach's dir doch nicht so schwer und gib fn einen initialen Wert.
 

phrygian

Mitglied
Hallo Wildcard!

Danke nochmal für Deine Hilfe. Das Programm läuft jetzt.


Gruß, phrygian

Code:
class Fibonacci
{
    public static void main(String[] args)
    {
        int n=Integer.parseInt(args[0]);
        int i=2;
        int fn; //n-te Fibonacci-Zahl
        int fn_1=1; // (n-1)-te Fibonacci-Zahl; zu Beginn ist sie gleich 1
        int fn_2=1;

		if(n<0)
			{
			System.out.println("Negative Zahlen sind nicht erlaubt!");
			}

		else
			{
        	if(n==0 || n==1)
        		fn=1;
        	else
        		{
				fn=0; //willkürlich gewählte Initialisierung

				while(i<=n)
                	{
                    fn=fn_1 + fn_2;
                    fn_2=fn_1;
                    fn_1=fn;
                    i += 1;
					}
				}
			System.out.println(fn);
			}
	}
}
 
M

meleke

Gast
Hi. Ich habe die gleiche Aufgabe zu bewältigen und verstehe ungefähr nichts vom programmieren.
wir sollen jedoch mit rekursion arbeiten. was muss ich beachten, dass sich die methode immer wieder duch rekursion selbst aufruft? kann mir bitte jemand helfen! Liebe grüße, meleke
 

Wildcard

Top Contributor
Die Definition der Folge ist doch schon rekursiv. Lies 10 Minuten in einem Java-Buch und dann hast du die entsprechende Syntax dazu.
Davon abgesehen verstehe ich nicht warum du programmieraufgaben bekommst wenn du nicht programmieren kannst ???:L
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben