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ű:

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

...az első 2 szám adott, ezt követően minden szám az őt megelőző 2 szám összege, mert:

A számsorban tetten érhető arányosság már évezredek óta ismert aranymetszés néven (divina proportione - Isteni arány) :

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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