# Fibonacci-Zahlen & kopfgesteuerte Schleifen & Strukt



## alphaChill (9. Sep 2008)

Hallo an alle...


bin gerade dabei ein paar kleine Probleme zu lösen... 

Ich würde gern ein Struktogramm für die Fibonacci-Zahlen  (bis 13) anlegen (also: 1 1 2 3 5 8)

Mein Ergebnis würde so aussehen:







Frage: brauche ich tatsächlich eine Eingabe? Ich lege den Wert ja eigentlich bei der Initialisierung fest.


Mein Java-Code sieht wie folgt aus:


```
int z = 0;
		int n = 13;
		int i = 1;
		
		for(i = 1; i < n; i = z + i){
			z = i + z;
			System.out.println(i);
			System.out.println(z);
		}
```

Die Ausgabe passt auch (1 1 2 3 5 8), aber ich das ganze wie folgt ausführen lasse (mit einem zusätztlichen "System.out.println(i)"), habe ich als Ausgabe folgendes Ergebnis: "1 1 2 3 5 8 13". Gibt es nicht einen Weg, um das im Programmcode zu vereinfachen? Mir gefällt das 
	
	
	
	





```
i = z + i){
			z = i + z;
```
 nicht.

Noch eine Frage: Wo kann man Übungen zu kopfgesteueren Schleifen finden, bearbeiten und lernen? Mir geht es hier hauptsächlich um die Anwendung von Struktogrammen.

Gruß alphaChill


----------



## alphaChill (10. Sep 2008)

Kann mir hier keiner helfen?

... entschuldigt, wenn ich aufdringlich erscheine... bräuchte die Antworten bis 18 Uhr...

Gruß alaphaChill


----------



## SlaterB (10. Sep 2008)

also 
i = z + i;
und
z = i + z;
kannst du doch wohl kaum vermeiden, wenn das auch im Struktogramm so steht, oder kannst du das beliebig modifizieren?

ansonsten vielleicht eine while-Schleife und zwei gleichberechtige Fibonaccizahlen z1 und z2, die du ganz normal hochaddierst,

zwei Ausgaben in einem Schleifendurchlauf ist in jedem Fall schlecht, so bekommst du ja immer eine gerade Anzahl von Ausgaben, nicht genau so viele wie benötigt

zu Struktugramm-Fragen wirds schwieriger, wer benutzt sowas schon, wenn nicht gerade in einer entsprechenden Hochschul-Vorlesung/ Schulklasse


----------



## Marco13 (10. Sep 2008)

Ja, sowas

i = z + i;
z = i + z;

kann man auch schreiben als

i += z;
z += i;;

aber das bringts ja jetzt nicht so....

Und Übungsaufgaben ... müßt ich auch erst Websuchen. Denk' dir irgendwelche Beispiele aus - vielleicht ganz dediziert, mit der Unterscheidung der Schleifentypen, die sich aus der natürlichen Sprache ergibt:
"Für alle Zahlen ... " oder "Für alle Elemente..." -> for-Schleife
"Solange eine Bedingung erfüllt ist, wiederhole...." -> while-Schleife
Im Gegensatz zu "fußgesteuerten" Schleifen
"Wiederhole.... solange eine Bedingung erfüllt ist" -> do-Schleife


----------



## alphaChill (10. Sep 2008)

Das Struktogramm habe ich selbst erstellt ;-) Wollte wissen, ob man das so stehen lassen kann...
Und die Zahlen sollen über eine Kopfgesteuerteschleife ausgegeben bzw. errechnet werden...


----------



## xysawq (10. Sep 2008)

2 Sachen:

1. Im Struktogramm wird i=0 gesetzt und im Code i=1 (wobei i=1 richtig ist, da sonst unendlich lange 0 ausgegeben wird).
2. Wenn du im Struktogramm "wiederhole solange i<n" schreibst, warum machst du es im Code nicht genauso und schreibst "while(i<n)"?

Wie SlaterB bereits sagte sind zwei println in einer Schleife nicht zu empfehlen.

Mache es einfach ausführlich, übersichtlich und vor allem richtig:


```
int fNminus2 = 0;
int fNminus1 = 1;
int N = 13;
int fN = 0;

System.out.print(fNminus2 + " ");
System.out.print(fNminus1 + " ");
fN = fNminus1 + fNminus2;
fNminus2 = fNminus1;
fNminus1 = fN;

while(fN<N)
{
	System.out.print(fN + " ");
	fN = fNminus1 + fNminus2;
	fNminus2 = fNminus1;
	fNminus1 = fN;
}
```

Jetzt weißt du auch nach 10 Jahren noch, was du da geschrieben hast (sogar ohne Kommentare).

EDIT: So "musst" du es machen, wenn du eine Kopfgesteuerte Schleife nimmst, zu empfehlen währe aber eine Fußgesteuerte. (Natürlich musst du es nicht so machen, aber es ist verständlicher.)


----------



## xysawq (10. Sep 2008)

Übrigens ist es sehr interessant über die Fibonacci-Zahlen bei Wikipedia zu lesen, wie sehr Mathematik doch in der Natur Einfluss nimmt... Wahnsinn, unbedingt mal weiterbilden Leute!


----------



## AnonymerFred (11. Sep 2008)

alphaChill hat gesagt.:
			
		

> Mir gefällt das
> 
> 
> 
> ...


for(i = 1; i < n; i = z + i, z = i + z) {


----------



## AnonymerFred (11. Sep 2008)

Ach ne, damit wird die zweite Zuweisung zu spät durchgeführt, sorry!


----------

