C a C++ týden ITnetwork Flashka zdarma
Akce! Pouze tento týden sleva až 80 % na kurzy C++. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Fibonacciho posloupnost

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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

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

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:

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! :)


 

 

Aktivity (2)

 

 

Komentáře

Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:30. března 18:15

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.

Zrovna tohle bych jako ten největší problém neviděl. Pro výpočet n-tého čísla nám stačí rekurze hloubky n. Daleko horší je to s časovou složitostí, která je exponenciální (řádově 2n), protože dochází k opakovaným výpočtům mnoha Fibonacciho čísel.

Odpovědět  +3 30. března 18:15
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.