# Nicht initialisierte Variable in meinem Fibonacci-Programm



## phrygian (11. Nov 2006)

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


```
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);
    }
}
```


----------



## Wildcard (12. Nov 2006)

Der Fehler ist das 'fn' nicht initialisiert wird wenn die if Bedingung nicht erfüllt wird.


----------



## phrygian (12. Nov 2006)

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 (12. Nov 2006)

Ü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 

```
while(i<=n)
                fn=fn_1 + fn_2;
                fn_2=fn_1;
                fn_1=fn;
                i += 1;
```
vielleicht

```
while(i<=n)
            {
                fn=fn_1 + fn_2;
                fn_2=fn_1;
                fn_1=fn;
                i += 1; 
            }
```
meinen.
lg


----------



## Wildcard (12. Nov 2006)

```
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.

```
if(n==0 || n==1)
```
Trifft nicht zu -> fn nicht initialisiert.

```
while(i<=n)
```
i ist nicht kleiner als n -> fn immer noch nicht initialisiert -> Compilerfehler


----------



## phrygian (12. Nov 2006)

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.


```
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 (12. Nov 2006)

Du verlangst da zuviel vom Compiler. Er weiß nur das diese Schleife

```
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 (12. Nov 2006)

Hallo Wildcard!

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


Gruß, phrygian


```
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);
			}
	}
}
```


----------



## meleke (23. Nov 2006)

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 (23. Nov 2006)

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


----------

