rekurze:
v programovacích termínech lze rekurzivní funkci definovat jako rutinu, která se volá přímo nebo nepřímo.
pomocí rekurzivního algoritmu lze některé problémy vyřešit poměrně snadno. Towers Of Hanoi (TOH) je jedním z takových programovacích cvičení. Pokuste se napsat iterační algoritmus pro TOH. Navíc každý rekurzivní program lze zapsat pomocí iteračních metod(viz datové struktury Lipschutz).
matematicky rekurze pomáhá snadno vyřešit několik hádanek.,
například rutinní rozhovor Otázka,
ve straně N lidí, každý člověk bude potřást rukou s sebou pouze jednou. Celkem kolik rukou-třese by se stalo?
řešení:
lze jej řešit různými způsoby, grafy, rekurzí atd. Podívejme se, jak rekurzivně to lze vyřešit.
existují N osoby. Každý člověk se navzájem potřásá pouze jednou. Vzhledem k tomu, n-té osoby, (y) musí potřást rukou S (N-1) osoby. Nyní se problém snížil na malou instanci (N-1) osob. Za předpokladu, že TN jako total shake-hands, může být formulován rekurzivně.,
TN = (N-1) + TN-1
řešení rekurzivně poskytuje aritmetickou řadu, kterou lze vyhodnotit na N(N-1)/2.
cvičení: ve straně N párů, pouze jedno pohlaví (buď muž nebo žena) může potřást rukou s každým. Kolik by se jich stalo?
obvykle rekurzivní programy mají za následek špatné časové složitosti. Příkladem je řada Fibonacci. Časová složitost výpočtu n-tého Fibonacciho čísla pomocí rekurze je přibližně 1,6 n. To znamená, že stejný počítač trvá téměř o 60% více času pro další Fibonacciho číslo. Rekurzivní Fibonacciho algoritmus překrýval podproblémy., Existují i jiné techniky, jako je dynamické programování, které zlepšují takové překryté algoritmy.
nicméně, málo algoritmů (např. sloučení, rychlé řazení atd.) má za následek optimální časovou složitost pomocí rekurze.
Základní případ:
jedním kritickým požadavkem rekurzivních funkcí je koncový bod nebo základní případ. Každý rekurzivní program musí mít základní případ, aby se ujistil, že funkce skončí. Chybějící základní případ má za následek neočekávané chování.,
Různé způsoby psaní rekurzivních funkcí
funkce volání sebe: (přímá cesta)
většina z nás si uvědomuje alespoň dva různé způsoby psaní rekurzivních programů. Níže jsou uvedeny věže hanojského kódu. Je to příklad přímého volání.
výstup:
Move the disk 1 from S to DMove the disk 2 from S to AMove the disk 1 from D to AMove the disk 3 from S to DMove the disk 1 from A to SMove the disk 2 from A to DMove the disk 1 from S to D
časová složitost TOH lze vypočítat formulováním počtu tahů.
musíme přesunout první disky N-1 ze zdroje na pomocné a z Pomocného do cíle, tj. první disky N-1 vyžadují dva pohyby. Další přesun posledního disku ze zdroje do cíle., Matematicky to lze definovat rekurzivně.
MN = 2MN-1 + 1.
můžeme snadno vyřešit výše uvedený rekurzivní vztah (2n-1), který je exponenciální.
rekurze pomocí vzájemné funkce volání: (nepřímá cesta)
nepřímé volání. Ačkoli nejméně pratical, funkce může volat jinou funkci, která inturn volá bývalou funkci. V tomto případě by obě funkce měly mít Základní pouzdro.
obranné programování:
můžeme kombinovat techniky obranného kódování s rekurzí pro elegantní funkčnost aplikace., Rekurzivní programování obvykle není povoleno v aplikacích kritických pro bezpečnost, jako jsou řízení letu, monitorování zdraví atd. Lze však použít techniku statického počítání, aby se zabránilo nekontrolovaným voláním (nikoli v systémech kritických pro bezpečnost, mohou být použity v měkkých systémech v reálném čase).
hloubka callDepth závisí na velikosti rámu funkce zásobníku a maximální velikosti zásobníku.
rekurze pomocí funkčních ukazatelů: (nepřímá cesta)
rekurze může být také implementována pomocí funkčních ukazatelů. Příkladem je signal handler v systémech stížností POSIX., Pokud psovod způsobí spuštění stejné události, kvůli které se volá psovod, funkce se znovu objeví.