Video: OCAML Tutorial 13/33: A Word on Recursion and Recursive Functions 2024
Recursie is een groot, eng woord dat je vaak hoort over programmeren, vooral het frustrerende soort van programmeren dat ze op de universiteit doceren. Hoewel het een eenvoudig concept is om te beschrijven, is het echt een mind-blower als het gaat om het begrijpen hoe recursie werkt. De meeste mensen accepteren het gewoon en gaan verder. Niet hier!
Recursie is in feite het proces waarbij een functie zichzelf aanroept. Bijvoorbeeld:
void funct (int x) {funct (x);}
In dit stuk code zie je een verschrikkelijk voorbeeld van een recursieve functie, maar het dient hier illustratieve doelen: de functie () functie roept zichzelf aan. Dat is recursie. Wat er in dit voorbeeld gebeurt, is eigenlijk een eindeloze lus, en dankzij een technische iets-of-anders, de stack pointe r , wordt de computer uiteindelijk vastgelopen. Maar het is slechts een illustratie.
Voor recursie om te werken, moet de functie een bailout-conditie hebben, net als een lus. Daarom moet de waarde die is doorgegeven aan de recursieve functie of de geretourneerde waarde, worden getest. Hier is een beter voorbeeld van een recursieve functie:
ongeldige recursie (int x) {if (x == 0) return; else {puts ("Boop!"); recursion (- x);}}
De functie recursion () accepteert de waarde x . Als x gelijk is aan nul, wordt de functie geblokkeerd. Anders wordt de functie opnieuw aangeroepen, maar wordt de waarde x verlaagd. De operator voor het verlagen van het prefix wordt gebruikt, zodat de waarde x wordt verminderd voordat de oproep wordt gedaan.
De functie sample recursion () spuwt in principe de tekst Boop! een bepaald aantal keren. Dus als recursie () wordt aangeroepen met de waarde 10, wordt die tekst tien keer weergegeven.
Het krankzinnige deel over recursie is dat de functie zichzelf blijft noemen en zich strakker en strakker wikkelt alsof het een spiraal is. In het voorgaande voorbeeld wikkelt de voorwaarde x == 1 uiteindelijk die bochtige puinhoop af, steeds meer terugtrekkend totdat de functie is voltooid.
De volgende code toont een volledig programma met de functie sample recursion ().
#omvat lege recursie (int x); int main () {recursion (10); return (0);} void recursion (int x) {if (x == 0) return; else {puts ("Boop!"); recursie (- x);}}
Een veel voorkomende demonstratie van recursie is een faculteit-functie. De faculteit is het resultaat van het vermenigvuldigen van een waarde met elk van de positieve gehele getallen. Bijvoorbeeld:
4! = 4 × 3 × 2 × 1
Het resultaat van deze faculteit is 24. De computer kan deze berekening ook uitvoeren door een lus te implementeren of een recursieve functie te creëren.Hier is zo'n functie:
int-factor (int x) {if (x == 1) return (x); else return (x * faculteit (x-1));}
Zoals bij de andere recursieve functies bevat de functie faculteit () een exitvoorwaarde: x == 1. Anders wordt de functie opnieuw aangeroepen met één minder dan de huidige waarde van x . Maar alle actie vindt plaats met de retourwaarden.