# Fibonacci Zahlen, Verständnissproblem



## xyt4n (27. Sep 2012)

Hallo Forum,

ich muss die Fibonacci Zahlen ausgeben. Ich hatte zwischendurch immer paar Fehler, die ich nicht ausmerzen konnte und dann habe ich ein wenig im Internet abgeguckt. 

Im Prinzip habe ich die fib Methode hinzugefügt und es funktionierte. Ich verstehe was da steht, verstehe aber nicht wieso es da steht. Ich hatte sogar schon mal genau die gleiche Methode geschrieben, aber dann hatte ich nicht die Befehle in Zeile 21, 22, 24, 25 und stattdessen nur ein Methoden-Aufruf.

1. Frage ist, durch welchen Befehl wird die Methode fib ausgeführt?
2. Frage ist, wieso muss in der fib Methode das gleiche stehen, was schon in der Main methode steht? Wieso reicht die Main Methode nicht aus?


```
import java.util.Scanner;
class informatik {
	
public static int fib(int n){
	        if(n == 0){
	            return 0;
	        }if(n == 1){
	            return 1;
	        }else{
	            return fib(n-2)+ fib(n-1);
	    }
	}
	
public static void main (String args[]){
		
		
		Scanner sc = new Scanner (System.in);
		int n=sc.nextInt();		
		int array [] = new int[n];
		int i;
		array[0]=0;
		array[1]=1;
		
		for(i=2; i<array.length; i++){
            array [i] = array [i-1]+ array [i-2];}
		
        System.out.print("{");
		for (i =0; i<=array.length-1; i++){System.out.print(array[i]+", ");}
		System.out.print("}");
}
}
```


----------



## Firephoenix (27. Sep 2012)

> 1. Frage ist, durch welchen Befehl wird die Methode fib ausgeführt?


Die Methode wird hier garnicht aufgerufen 



> 2. Frage ist, wieso muss in der fib Methode das gleiche stehen, was schon in der Main methode steht? Wieso reicht die Main Methode nicht aus?


Lösch doch einfach mal die fib-Methode, das Programm geht trotzdem.

Genaueres gleich, erstmal aber eine Stilverbesserung:
Über ein Array iteriert man normalerweise so:

```
for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + ", ");
		}
```

Tatsächlich macht die main-Methode fast das gleiche wie die fib-Methode, der unterschied ist nur, dass hier die Rekursion strukturell über die Indizes auf dem Array erfolgt

```
array[0] = 0;
		array[1] = 1;
```
entspricht dabei

```
if (n == 0) {
			return 0;
		}
		if (n == 1) {
			return 1;
		}
```
für größere n gilt dann:

```
array[i] = array[i - 1] + array[i - 2];
```
was

```
else {
			return fib(n - 2) + fib(n - 1);
		}
```
entspricht.

Siehst du den Zusammenhang?

Die Version mit dem Array hat den Vorteil, das du alle Zahlen berechnest und abspeicherst. Allerdings wird dir das Programm für eine Eingabe < 2 crashen, da array die länge der Eingabe hat und du fest auf [0] und [1] zugreifst.
Eine schönere Version die nur das Array benutzt könnte so aussehen:

```
public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		if (n < 2) {
			n = 2;
		}
		int array[] = new int[n];
		array[0] = 0;
		array[1] = 1;

		for (int i = 2; i < array.length; i++) {
			array[i] = array[i - 1] + array[i - 2];
		}
		// Alternative Ausgabe mit eckigen klammern:
		// System.out.println(Arrays.toString(array));
		System.out.print("{");
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + ", ");
		}
		System.out.print("}");
	}
```

Gruß


----------



## xyt4n (27. Sep 2012)

Vielen Dank!

Ich hab das im Prinzip verstanden, wusste aber nicht das mein Programm ohne die Methode läuft. Ich frage mich im welchen Moment ich den Fehler verbessert habe und was das für ein Fehler war. ???:L
Trotzdem Danke!


----------

