Nejprve připomeňme základní znalost o fungování rekurze a předávání parametrů. Rekurze je realizována zásobníkem.1 Všechny rekurzivně volané funkce se ukládají na zásobník. Na zásobníku se pro každou volanou funkci vytvoří záznam, který obsahuje informace o volané funkci a předané parametry. Po jejím skončení se tento záznam odebere ze zásobníku a program se podle předchozího záznamu (ten co je na vrcholu zásobníku) vrátí k předchozí funkci, a to do místa za rekurzivní volání právě proběhlé funkce.

Všechny parametry volané funkce se kopírují na zásobník a odtamtud je volaná funkce teprve využívá. Říká se tomu předávání parametrů hodnotou. Pokud bychom chtěli volané funkci předat pole, tak se nejprve celé pole zkopíruje na zásobník a teprve pak s ním začne funkce pracovat. Abychom se vyhnuli zbytečnému kopírování, tak můžeme použít předávání parametrů odkazem. To funguje tak, že funkci předáme pouze ukazatel na předávané pole (adresu paměti, kde pole bydlí). Místo kopírovaní celého pole tedy stačí uložit na zásobník jeden ukazatel.

V některých případech můžeme rekurzi odstranit tím, že ji nahradíme jednoduchým cyklem.

Například funkci faktoriál naprogramovanou pomocí rekurze nahradíme for-cyklem. Ušetříme čas za volání funkce včetně předávání parametrů. Druhou výhodou je paměťová úspora. Zásobník, přes který se rekurzivní volání realizuje, zabere paměť $\OO(n)$. Má to ještě jednu výhodu. Pro cyklus může překladač uplatňovat optimalizace (predikce podmínky), kdežto pro rekurzivní volání ne.

Faktorial$(n)$:
	 if $n > 1$  then
	 	 return ($n\cdot $Faktorial$(n-1)$  )
	 else
	 	 return $1$

Faktorial($n$):
	 $fakt := 1$
	 for $i:=2$  to $n$  do
	 	 $fakt := fakt \cdot i$
	 return $fakt$

Ne vždy můžeme rekurzi nahradit cyklem. Co ale funguje vždy je nahrazení rekurze vlastním zásobníkem. Jak jsme si už vysvětlili, rekurze je už sama o sobě realizována zásobníkem. Na ten se ale ukládají úplně všechny funkce, které program rekurzivně volá. Každá rekurzivně volaná funkce má jiný počet různě velkých parametrů. Proto se na tento zásobník ukládá více informací, než je v některých případech potřeba. Z těchto a ještě i dalších důvodů můžeme realizací vlastního zásobníku něco ušetřit.2

Podobného efektu docílíme i správnou volbou programovacího jazyka, nepoužíváním věcí, které nejsou potřeba (například objektů).3