PHP-lessen - les 9 - Recursie
In de vorige les hebben we het gebruik van functies in PHP besproken. Nu gaan we iets dieper in op hun toepassing. Tot nu toe hebben we functies van dit type bekeken:
<?php function myFunction(){ // definitie van een functie } $x = myFunction(); // aanroep van de functie ?>
Maar wat gebeurt er als we een functie aanroepen binnen de functie zelf?
<?php function myFunction(){ $x = myFunction(); ... return $x; } $y = myFunction();
Zo’n aanroep van een functie binnen haar eigen lichaam heet recursie. Dat klinkt misschien ingewikkeld in theorie, maar in de praktijk is het vrij eenvoudig.
Laten we een functie maken die een getal verheft tot een macht. Uit de wiskunde weet je vast nog dat een macht betekent dat een getal zichzelf n keer vermenigvuldigt. In PHP ziet dat er zo uit:
<?php function myDegree($x, $n){ if($n == 0){ return 1; } if($n < 0){ return myDegree(1/$x, -$n); // -$n keert het teken om van negatief naar positief } return $x * myDegree($x, $n-1); // functie-aanroep binnen de functie } $y = myDegree(2, -4); // eerste functie-aanroep print $y; ?>
Laten we deze functie stap voor stap bekijken. Allereerst: zodra return
wordt uitgevoerd, stopt de functie en geeft ze de opgegeven waarde terug.
De eerste constructie if($n == 0)
betekent: als de macht 0 is, retourneer 1. Dat klopt, want elk getal tot de macht nul is 1. Vervolgens, if($n < 0)
— als de macht negatief is, maken we de macht positief, maar nemen we het omgekeerde van het getal (1 gedeeld door het getal), wat wiskundig correct is.
Tot slot, als de macht niet 0 of negatief is, roept de functie zichzelf opnieuw aan bij elke vermindering van de macht met 1, terwijl ze het resultaat steeds met $x vermenigvuldigt.
Bekijk de stappen van de functie:
1. Macht = -4, getal = 2.
De tweede if
wordt uitgevoerd, het getal wordt omgezet in een breuk, en de macht wordt positief.
2. Macht = 4, getal = 0,5.
De macht is positief en niet nul, dus de functie voert uit:
return $x * myDegree($x, $n-1);
3. Macht = 3, getal = 0,25.
4. Macht = 2, getal = 0,125.
5. Macht = 1, getal = 0,0625.
Hier zal de eerste if
worden uitgevoerd en 1 teruggeven. Die 1 wordt vervolgens vermenigvuldigd met de vorige resultaten, en de recursie eindigt.
Een vergelijkbaar voorbeeld is het berekenen van de faculteit van een getal. De faculteit van n is het product van alle getallen van 1 tot n. Dus voor 6 is dat 6×5×4×3×2×1 = 720. En zoals je al kunt raden, gebruiken we hier ook recursie.
<?php function myRecursion($x){ if($x == 1){ return $x; } return $x * myRecursion($x-1); } $y = myRecursion(8); print $y; ?>
Dit voorbeeld is nog eenvoudiger dan het vorige, dus ik laat het aan jou om te analyseren hoe de parameters van de functie myRecursion
veranderen bij elke stap.