Projekt: Rekurze a Fibonacci
Leden 2026
Po sérii projektů zaměřených na DOM a API (jako Weather App) přišel v The Odin Project ostrý zlom. Místo vytváření uživatelského rozhraní jsem se musel ponořit do teorie počítačových věd (Computer Science).
Tématem byla Rekurze. Zadání znělo zdánlivě jednoduše: Napsat funkci, která vygeneruje Fibonacciho posloupnost. Háček byl v tom, že jsem to musel udělat dvěma způsoby – pomocí klasické smyčky a pomocí rekurze.
O co v projektu jde
Cílem bylo pochopit, jak funguje volání funkce uvnitř téže funkce a jak se liší od běžné iterace.
- Úkol A: Napsat funkci
fibs(n), která vrátí pole čísel pomocí smyčky. - Úkol B: Napsat funkci
fibsRec(n), která udělá to samé, ale bez smyček – pouze voláním sebe sama.
Iterativní řešení (Smyčka)
První část byla přímočará. Vytvořit pole [0, 1] a ve smyčce přičítat poslední dvě čísla. Je to rychlé, efektivní a logické ($O(n)$).
function fibs(n) {
if (n <= 0) return [];
if (n === 1) return [0];
let arr = [0, 1];
for (let i = 2; i < n; i++) {
arr.push(arr[i - 1] + arr[i - 2]);
}
return arr;
}
Rekurzivní řešení (Magie)
Tady začala ta pravá výzva. Rekurze vyžaduje změnu myšlení. Místo “udělej tohle 10x” musíte definovat Base Case (záchrannou brzdu) a rekurzivní krok.
Musel jsem pochopit, jak se funkce zanořují do sebe (Stack) a jak si předávají výsledky zpátky nahoru.
function fibsRec(n) {
console.log("This was printed recursively");
// 1. Base Case - kdy se rekurze zastaví
if (n <= 0) return [];
if (n === 1) return [0];
if (n === 2) return [0, 1];
// 2. Rekurzivní krok - volám sám sebe pro menší počet
const arr = fibsRec(n - 1);
// 3. Výpočet až po návratu z hloubky
arr.push(arr[arr.length - 1] + arr[arr.length - 2]);
return arr;
}
Co bylo náročné
- Změna myšlení: Přestat myslet v krocích “jdi dál” a začít myslet v krocích “zavolej se s menším úkolem”.
- Call Stack: Pochopit, že kód pod zavoláním funkce se provede až ve chvíli, kdy se ta vnořená funkce vrátí. Ze začátku mi to dělalo v hlavě zmatek.
- Base Case: Pokud jsem zapomněl na podmínku ukončení, prohlížeč spadl na chybu Maximum call stack size exceeded (Stack Overflow).
Co jsem se naučil
Princip rekurze: Rekurze není magie, je to jen zásobník (stack) volání funkcí. Každé volání čeká na výsledek toho pod ním.
Čitelnost vs. Výkon: Rekurzivní kód může být kratší a elegantnější (hlavně u stromových struktur nebo Merge Sortu), ale u jednoduchých věcí jako Fibonacci je smyčka často efektivnější a šetrnější k paměti.
Ladění: Naučil jsem se lépe používat debugger, abych viděl, jak se “stack” plní a vyprazdňuje.
GitHub: projekt fibonacci