NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
IT rekvalifikace s podporou uplatnění. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!

Fibonacciho posloupnost

V tomto článku si přiblížíme, co je to Fibonacciho posloupnost a s ní související další pojmy, které se často používají v matematice a dalších disciplínách.

Fibonacciho posloupnost

Jedná se o matematickou posloupnost, která začíná čísly 0 a 1. Každé další číslo je poté součet dvou předchozích čísel. Číslům v této posloupnosti se říká Fibonacciho čísla.

Začátek posloupnosti tedy vypadá takto:

0 1 1 2 3 5 8 13 21 34 55 89 144 ...

Z vývojářského pohledu si s touto definicí vystačíme. Oblíbené programátorské úlohy jsou např. jak Fibonnaciho čísla dostat např. do pole a následně z pole vypsat x-té číslo. Nebo jak tuto posloupnost vypsat pozpátku a podobně.

Matematicky se dá Fibonacciho posloupnost vyjádřit také rekurzivně, explicitně nebo maticí. Maticemi se nebudeme zabývat, další vyjádření si v článku ukážeme.

Fibonacciho králíci

Fibonacci popsal svou posloupnost na množení populace králíků. S tímto příkladem jste se s největší pravděpodobností již někdy setkali. Jedná se o na první pohled jednoduchý matematický příklad, kdy na začátku máme:

  • jeden pár králíků (samce a samici)
  • pár je produktivní od druhého měsíce života
  • každý měsíc zplodí každý produktivní pár jeden další pár
  • platí ideální podmínky, králíci nikdy neumírají, nejsou nemocní apod.

Pro výpis této posloupnosti se často používá jen jednoduchý průchod cyklem a pomocné proměnné, kde máme uložené předchozí dva prvky, abychom dokázali vypočítat prvek následující.

Algoritmus

Teď si můžeme zkusit naprogramovat jednoduchý příklad, kdy pomocí vnořených cyklu necháme do řádků pod sebe vypisovat jednotlivé počty králíků podle Fibonnaciho poslounopsti. Por názornost použijeme obrázek králíka níže :) :

Fibonacciho posloupnost – Králíci - Matematické algoritmy

Jelikož by bylo trochu náročnější vypsat zdrojový kód pro všechny možné programovací jazyky, vezmu to obecněji (za příklad poslouží kód v JavaScriptu). Bude nutné si vytvořit 2 proměnné, např. predminula a minula pro počet v předchozích dvou generacích králíků. Uložíme do nich hodnoty 0 a 1. Dále pak budeme potřebovat proměnnou soucasna, do které se bude ukládat mezivýsledek, počet králíků současné generace. Prvnímu cyklu nastavíme, kolikrát se má zopakovat (počet generací k výpisu). Samotná Fibonacciho posloupnost samozřejmě nemá konečné číslo. Druhý cyklus nám bude vypisovat obrázky králíků:

let predminula = 0;
let minula = 1;

for(let i = 3; i<10; i++) {
    let soucasna = predminula + minula;
    predminula = minula;
    minula = soucasna;

    for(let j = 0; j < soucasna; j++) {
        document.write('<img src="rabbit.png" width="32" height="32">');
    }
    document.write("<br />");
}

V každém průběhu cyklu vypočítáme počet králíků v současné generaci jako součet králíků v předchozích dvou generacích. Současná generace se poté pro další běh cyklu stává minulou a minulá předminulou.

Výsledek:

Fibonacciho posloupnost – Králíci - Matematické algoritmy

Rekurzivní algoritmus

Určitě vás napadlo, že by se n-tý prvek v řadě dal zjistit i rekurzí. Daná funkce by vypadala takto:

function fibonacci(n) {
  if (n < 2)
    return n;
  else
    return fibonacci(n - 1) + fibonacci(n - 2)
}

Pokud chceme nultý nebo první prvek, je výsledkem 0, resp. 1. Tím se splní podmínka ukončení rekurze. Pokud chceme prvek pro n od 2 a více, vrátíme součet prvků pro n - 1 a n - 2, tedy 2 předchozí prvky posloupnosti. Rekurze takto postupně postoupí od vysokých n až ke známým hodnotám pro 0 a 1 a pomocí těchto výsledků se zpětně sestaví n-tý prvek.

Rekurzivní řešení je méně efektivní než řešení cyklem, jelikož vyžaduje dodatečnou paměť zásobníku k udržení všech vnořených volání funkce.

Zlatý řez a explicitní vyjádření

N-tý prvek Fibonacciho posloupnosti můžeme i vypočítat pomocí vzorečku, bez nutnosti použití členů předchozích. Jak asi tušíte, řešení bude mnohem složitější a také méně přesné, proto tato metoda není v programování preferována.

Se Zlatým řezem, tzv. "ideální proporcí", se můžeme setkat například v umění nebo v přírodě (šnečí ulity, schránky dalších měkkýšů, zobáky, rohy...), ale také v umění (proporce obrazů, fotografií, rozvržení hudby, knih, scénářů,...).

Hodnota Zlatého řezu se velice blíží hodnotě Fí (φ), což je iracionální číslo. Dá se vypočítat jako: φ = (1+√5) / 2 ≈ 1,618.

Této hodnotě se blíží rychlost růstu Fibonacciho posloupnosti. Fibonacciho spirála je tudíž často vnímána jako synonymum pro Zlatý řez.

Díky Zlatému řezu, technice generujících funkcí, nebo za pomoci řešení rekurentních rovnic, lze dospět k explicitnímu (nerekurzivnímu) vztahu pro n-tý člen Fibonacciho posloupnosti, který vypadá takto:

Matematické algoritmy

Kde:

  • φ ≈ 1,618
  • n - n-tý člen posloupnosti
  • F - podle Fibonacciho, označuje výsledek

Druhý člen této rovnice se s rostoucím n blíží nule. Asymptotické chování Fibonacciho posloupnosti je tudíž dáno prvním členem.

Ve skutečnosti je druhý člen malý i pro malá n, takže jej lze zcela zanedbat a získávat Fibonacciho čísla prostým zaokrouhlováním prvního členu na nejbližší celé číslo.

To je k základní problematice Fibonacciho posloupnosti asi vše. Děkuji za pozornost a doufám, že jste se dozvěděli něco nového! :)


 

Všechny články v sekci
Matematické algoritmy
Článek pro vás napsala Lucie Hartingerová
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Aktivity