Úkol:
Vypište prvních třináct členů Fibonacciho posloupnosti, tj. řady 1, 1, 2, 3, 5, 8...
Samozřejmě zcela zásadní je vědět, jak vypadá Fibonacciho posloupnost ^_^ Když nevíme, podíváme se třeba na Wikipedii a zjistíme, že n-tý člen posloupnosti je zadán rekurzivním vztahem pomocí dvou předchozích členů:
an = an-1 + an-2
Odtud mimo jiné vyplývá, že na začátku programu musíme první dva členy už znát. Ostatně stejně jako v matematice – jsou to dvě jedničky.
Uvědomme si několik důležitých skutečností:
Učiňme proto následující strategická rozhodnutí:
Shrňme rozhodnutí z předchozího rozboru do programového fragmentu. To znamená přepišme uvedený rekurzivní vztah do podoby funkce a uložme do seznamu již známé hodnoty posloupnosti:
Nyní potřebujeme spustit výpočet členů Fibonacciho posloupnosti. Uvedená posloupnost je nekonečná, použijme proto nekonečnou smyčku:
Zadání znělo vypsat prvních třináct členů posloupnosti. Pracovní seznam začíná se dvěma členy a smyčka while do něj postupně přidává po jednom další prvky. Nejjednodušší proto bude přepsat „nekonečnou podmínku“ True
na test délky seznamu:
< 13
“ funguje ze dvou důvodů:
while
spočítá další, tedy třináctý člen. Následující test pak již selže a program opustí smyčku while
a ukončí se.Předchozí program již zřejmě počítá, co jsme po něm chtěli (tedy mimo jiné svůj běh v požadovaném okamžiku ukončí), jen se to nikdy nedozvíme, protože mu zatím chybí jakýkoli výstup. Doplňme ho:
Nyní jsme hotovi – program vypočítá požadovaných prvních třináct členů Fibonacciho posloupnosti a vypíše je.
Když se na náš program nyní znovu podíváme, zjistíme, že funkce ntý_člen je v něm docela zbytečná – za prvé výpočet nového členu je až směšně jednoduchý a za druhé ho v celém programu potřebujeme pouze na jednom jediném místě. Uvedené řešení je sice pěkně strukturované a šlo by s minimálními změnami použít pro výpočet jiných posloupností (stačilo by pouze změnit funkční závislost, případně počet vstupních parametrů), ale v tomto konkrétním příkladě je možná až zbytečně obecné. Zjednodušme ho:
append
na prodloužení seznamu posloupnost.
Kód je možno upravit ještě úplně jiným způsobem:
for
.
Promyslení použití triku s počátečním nastavením „dvou posledních známých členů posloupnosti“ na n-2, n-1 = 0, 1
ponecháváme na čtenáři.
Viděli jsme, že přepsání uvedené matematické úlohy do programovacího jazyka bylo poměrně přímočaré – vztah pro n-tý člen jsme přepsali do podoby samostatné funkce a nekonečnou posloupnost jsme generovali nekonečnou smyčkou. Přitom ale:
Ačkoli první řešení by šlo doplnit o průběžný výpis počítaných členů a druhé naopak o jejich ukládání do výsledného seznamu, je mezi nimi z myšlenkového hlediska docela velký rozdíl. Nechť se nad ním čtenář zkusí zamyslet sám.