Gyakorlati alapok
Egy középkori zseni: Signore Fibonacci
Először nézzük meg a rejtélyes Fibonacci-sorozat számait:
0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34...
A nyugaton Leonardo Fibonacci olasz matematikus (1170? - 1250?) által felfedezett számsor mögött rejtőző matematika az aranymetszés szerint növekszik, amely szabály éppúgy megtalálható a természet számos jelenségében (például csigaház szerkezetében), mint emberi műalkotásokban (például Bartók zenéjében). Pedig a rendezőelv nagyon egyszerű:
...az első 2 szám adott, ezt követően minden szám az őt megelőző 2 szám összege, mert:
-
0 + 1 = 1
-
1 + 1 = 2
-
1 + 2 = 3
-
2 + 3 = 5
-
3 + 5 = 8
-
5 + 8 = 13
-
8 + 13 = 21
-
13 + 21 = 34
-
stb.
A számsorban tetten érhető arányosság már évezredek óta ismert aranymetszés néven (divina proportione - Isteni arány) :
Aranymetszés: egy értéket (mennyiséget, szakaszt) úgy osztunk 2 részre, hogy a kisebbik rész úgy aránylik a nagyobbikhoz, mint a nagyobbik rész az egészhez.
Mivel standard számsorról beszélünk, ezért a számsort generáló algoritmust kell leprogramoznunk. Nézzük meg a Fibonacci-sorozat első 20 elemét:
public class Main {
public static void main(String[] args) {
int [] tomb = new int[20];
tomb[0] = 0;
tomb[1] = 1;
for (int i = 0; i < tomb.length-2; i++){
tomb[i+2] = tomb[i] + tomb[i+1];
System.out.print (tomb[i] + " ");
}
}
}
Végeredmény:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
Észrevehető, hogy most kivételesen int típusú statikus tömbbel dolgoztunk, mert tudtuk, hogy folyamatosan egyszerre 3 elemet kell vizsgálni, még pedig szekvenciális módon és erre a for ciklusos iteráció i léptetése kiváló megoldás. A tomb[i+2] = tomb[i] + tomb[i+1] deklaráció tehát mindig egymás mellett lévő elemeket vizsgál meg, mivel i értéke ciklusonként változik. Ugyanakkor fontos volt a pontos inicializálás:
-
a tömb 1. eleme (tomb[0]) 0 kezdőértéket,
-
2. eleme pedig (tomb[1]) 1 értéket kapott.
Tanítványi kérdés
Most akkor a tömb minden egyes eleme fel van töltve vagy 2 hely a végén kimaradt?
Válasz
A tömb minden egyes eleme fel lett töltve, de az utolsó 2 elemhez a jelen működtető for ciklusban nem tudunk hozzáférni, mert annak tomb.length-2 pozíciónál mindenképpen le kell állnia, másként hibával (ArrayIndexOutOfBoundsException, azaz tömbindexhatár-túllépés kivétellel) szembesülünk a tomb[i+2] hivatkozás miatt. A megoldás, hogy az értékek kinyomtatását egy külön for ciklusra bízzuk. Bizonyításképpen a ciklusokat meg is számoljuk:
public class Main {
public static void main(String[] args) {
int [] tomb = new int[20];
tomb[0] = 0;
tomb[1] = 1;
for (int i = 0; i < tomb.length-1; i++){
tomb[i+2] = tomb[i] + tomb[i+1];
}
for (int i = 0; i < tomb.length; i++){
System.out.println((i + 1) + ". - " +
tomb[i] + " ");
}
}
}
Végeredmény:
1. - 0
2. - 1
3. - 1
4. - 2
5. - 3
6. - 5
7. - 8
8. - 13
9. - 21
10. - 34
11. - 55
12. - 89
13. - 144
14. - 233
15. - 377
16. - 610
17. - 987
18. - 1597
19. - 2584
20. - 4181
A számsorozat természetesen megoldható tömbhasználat nélkül is. Az alábbi kód külön érdekessége, hogy a számsorozat pontos reprodukáláshoz nem az eredményt írjuk ki (int eredmeny), hanem az int elsoSzam változó értékeit:
public class Main {
public static void main(String[] args) {
int szam = 20;
int elsoSzam = 0;
int masodikSzam = 1;
int eredmeny = 0;
for (int i = 0; i < szam; i++){
System.out.print (elsoSzam + " ");
eredmeny = elsoSzam + masodikSzam;
elsoSzam = masodikSzam;
masodikSzam = eredmeny;
}
}
}
Végeredmény:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181