recursie:
In programmeertermen kan een recursieve functie worden gedefinieerd als een routine die zichzelf direct of indirect aanroept.
met behulp van recursief algoritme kunnen bepaalde problemen vrij eenvoudig worden opgelost. Torens van Hanoi (TOH) is zo ‘ n programmeeroefening. Probeer een iteratief algoritme voor TOH te schrijven. Bovendien kan elk recursief programma geschreven worden met behulp van iteratieve methoden (refereer datastructuren door Lipschutz).
wiskundig recursie helpt om enkele puzzels gemakkelijk op te lossen.,
bijvoorbeeld, een routine interview vraag,
in een groep van N mensen, zal elke persoon haar/zijn hand schudden met elkaar slechts één keer. Hoeveel hand-shakes zou er in totaal gebeuren?
oplossing:
Het kan worden opgelost op verschillende manieren, grafieken, recursie, enz. Laten we eens kijken, hoe recursief het kan worden opgelost.
er zijn N personen. Elke persoon schud elkaar maar één keer de hand. Gezien N-de persoon, (en)moet hij de hand schudden met (N-1) personen. Nu is het probleem gereduceerd tot een klein aantal (N-1) personen. Uitgaande van TN als totale handen schudden, kan het recursief worden geformuleerd.,
TN =(N-1) + TN-1
Het recursief oplossen levert een rekenkundige reeks op, die kan worden geëvalueerd tot N (N-1)/2.
oefening: in een groep van N paren, kan slechts één geslacht (man of vrouw) met elk een hand schudden. Hoeveel handen schudden zou er gebeuren?
meestal resulteert recursieve programma ‘ s in slechte tijdscomplexiteiten. Een voorbeeld is de Fibonacci-serie. De tijd complexiteit van het berekenen van n-th Fibonacci nummer met behulp van recursie is ongeveer 1.6 n. het betekent dat dezelfde computer neemt bijna 60% meer tijd voor de volgende Fibonacci nummer. Recursieve Fibonacci algoritme heeft overlappende subproblemen., Er zijn andere technieken zoals dynamische programmering om dergelijke overlappende algoritmen te verbeteren.
echter, weinig algoritmen, (bijvoorbeeld merge sort, quick sort, etc…) resulteert in optimale tijd complexiteit met behulp van recursie.
Basiscase:
Een kritische eis voor recursieve functies is het eindpunt of basiscase. Elk recursief programma moet basisgeval hebben om ervoor te zorgen dat de functie zal beëindigen. Ontbrekende basiszaak resulteert in onverwacht gedrag.,
verschillende manieren om recursieve functies te schrijven
functie die zichzelf noemt: (directe manier)
De meesten van ons zijn zich tenminste bewust van twee verschillende manieren om recursieve programma ‘ s te schrijven. Hieronder gegeven is torens van Hanoi code. Het is een voorbeeld van directe roeping.
Output:
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
De tijdscomplexiteit van TOH kan worden berekend door het aantal bewegingen te formuleren.
We moeten de eerste n-1 schijven verplaatsen van bron naar hulpbron en van hulpbron naar bestemming, dat wil zeggen dat de eerste n-1 schijven twee zetten nodig hebben. Nog één beweging van de laatste schijf van bron naar bestemming., Wiskundig kan het recursief worden gedefinieerd.
MN = 2MN-1 + 1.
We kunnen de bovenstaande recursieve relatie (2N-1), die exponentieel is, gemakkelijk oplossen.
recursie met behulp van wederzijdse functie aanroep: (indirecte manier)
indirecte aanroep. Hoewel minst praktisch, kan een functie een andere functie die inturn noemt voormalige functie aanroepen. In dit geval moeten beide functies het basisscenario hebben.
Defensief programmeren:
We kunnen defensieve codeertechnieken combineren met recursie voor sierlijke functionaliteit van toepassing., Gewoonlijk is recursieve programmering niet toegestaan in veiligheidskritische toepassingen, zoals vluchtcontroles, gezondheidsmonitoring, enz. Men kan echter een statische teltechniek gebruiken om ongecontroleerde oproepen te voorkomen (niet in veiligheidskritische systemen, kan worden gebruikt in zachte real-time systemen).
callDepth diepte is afhankelijk van functie stack frame grootte en maximale stack grootte.
recursie met functie pointers: (indirecte manier)
recursie kan ook geà mplementeerd worden met functie pointers. Een voorbeeld is signal handler in POSIX klachtensystemen., Als de handler dezelfde gebeurtenis veroorzaakt waardoor de handler wordt aangeroepen, wordt de functie opnieuw ingevoerd.