Portfolio
Projekt: Rekurze a Fibonacci

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