Recursie is een leuk programmeerconcept, maar het kan een beetje lastig zijn om te leren. Recursie betekent gewoon iets dat zich herhaalt. Als je een brutaal voorbeeld van recursie wilt zien, probeer dan te zoeken naar recursie op Google. U zult een paasei vinden waarbij de suggesties voor zoekresultaten recursief zijn. Als je daarentegen wilt leren hoe je een recursieve functie codeert, lees dan verder!
Wat is een recursieve functie?
Een recursieve functie is een functie die zichzelf aanroept. U maakt in wezen een lus met een functie. Zoals je je kunt voorstellen, kunnen dit lastige functies zijn om te schrijven. U wilt niet dat uw code voor altijd blijft lopen.
Net als bij een lus, wordt een recursieve functie bestuurd door een voorwaarde. Zodra aan de voorwaarde is voldaan, stopt de functie met zichzelf aan te roepen, waardoor de lus wordt gestopt. Dit is hoe u een functie kunt maken die zichzelf aanroept zonder dat deze voor altijd draait.
Hoewel een recursieve functie werkt als een lus, wordt deze door de computer anders uitgevoerd. Sommige algoritmen zijn dus efficiënter in een lus en andere hebben baat bij een recursieve functie. Maar voordat we kijken naar het gebruik van een recursieve functie, moet u weten hoe u er een schrijft.
Hoe schrijf je een recursieve functie?
Alle recursieve functies hebben dezelfde basisstructuur:
FUNCTION name IF condition THEN RETURN result ELSE CALL FUNCTION name END FUNCTION
Het bovenstaande voorbeeld is geschreven in pseudo-code. Het schetst de structuur van de functie, die op elke taal kan worden toegepast. Voor de eenvoud zullen we ons in dit artikel concentreren op Python.
Het eerste dat moet worden opgemerkt over een recursieve functie is dat wanneer aan de voorwaarde is voldaan, de functie de recursie verlaat. Dit betekent dat wanneer u een recursieve functie schrijft, het eerste dat u wilt bepalen, is wanneer u de recursie moet stoppen.
Als niet aan de voorwaarde wordt voldaan, roept de functie zichzelf aan. Dus als u informatie naar de volgende lus wilt sturen, moet u deze als argument in uw functie verzenden. Dit kan recursieve functies veel meer kracht geven.
Gerelateerd: Wat is een functie in programmeren?
Recursief functievoorbeeld in Python
Het zal veel gemakkelijker zijn om te begrijpen hoe recursie werkt als u het in actie ziet. Laten we, om het te demonstreren, een recursieve functie schrijven die de faculteit van een getal retourneert.
Faculteiten retourneren het product van een getal en van alle gehele getallen ervoor. De faculteit van 5 is bijvoorbeeld 5 x 4 x 3 x 2 x 1 of 120.
def factorialFunction(numberToMultiply): if numberToMultiply == 1 : return 1 else : return numberToMultiply * factorialFunction(numberToMultiply - 1) result = factorialFunction(3) print(result) //Outputs: 6
Het bovenstaande programma geeft je het resultaat 6, wat de faculteit is van het getal 3. Dit kan in het begin een beetje verwarrend zijn. Het helpt als we het programma stap voor stap doorlopen.
- Wanneer de functie wordt aangeroepen, is numberToMultiply gelijk aan 3.
- Er wordt niet aan de voorwaarde voldaan, dus gaan we naar de else- voorwaarde.
- Onze functie retourneert 3 * maar wordt dan gepauzeerd. Het moet zichzelf oproepen om de rest van de waarde te bepalen die het teruggeeft.
- Wanneer de functie deze keer wordt aangeroepen, is de waarde van numberToMultiply gelijk aan 2.
- Er wordt niet aan de voorwaarde voldaan, dus gaan we naar de else-voorwaarde.
- Onze functie retourneert 2 * maar wordt dan gepauzeerd. Het moet zichzelf oproepen om de rest van de waarde te bepalen die het teruggeeft.
- De functie wordt nog een keer aangeroepen. Deze keer is de waarde van numberToMultiply gelijk aan 1.
- Onze if- voorwaarde is vervuld. De functie retourneert 1.
- De functie uit stap 6 kan nu 2 * 1 teruggeven aan de functie op stap 3.
- De functie in stap drie kan nu 3 * 2 * 1 retourneren, wat 6 is.
Recursie is een lastig begrip. Het kan handig zijn om het te zien als het stapelen van een functie op een andere functie. Zodra een functie uiteindelijk is opgelost, kan deze de informatie terug naar de stapel sturen, totdat alle functies hun antwoord hebben.
Dit is eigenlijk ongeveer wat uw computer doet. Wanneer u de functie aanroept, wordt deze in het geheugen vastgehouden totdat deze wordt geretourneerd. Dit betekent dat recursieve functies veel meer geheugen kunnen gebruiken dan een lus.
Het is dus misschien niet efficiënt om lussen als recursieve functies te schrijven, maar het is een geweldige manier om te oefenen met het construeren ervan. U zou lussen moeten kunnen coderen als recursieve functies met vergelijkbare resultaten.
Een voorbeeld van het converteren van een lus naar een recursieve functie
print("Enter an even number:") i = int(input()) while (i % 2) != 0 : print("That number is not even. Please enter a new number:") i = int(input())
Deze lus kan ook recursief worden geschreven als:
def recursiveFunction(number) : if (number % 2) == 0 : return number else: print("That number is not even. Please enter a new number:") recursiveFunction(int(input())) print("Enter and even number:") i = recursiveFunction(int(input()))
De eerste stap is om te bepalen wanneer u wilt dat uw functie stopt. In dit geval willen we dat het stopt zodra een even getal is ingevoerd. In ons voorbeeld volgt nummer de invoer van de gebruiker. Als ze een even getal invoeren, geven we het getal terug. Anders blijven we om een nieuw nummer vragen.
Om de lus in te stellen, roepen we onze functie opnieuw aan. Maar deze keer is het nummer dat we doorgeven aan de volgende functie het nieuwe nummer dat door de gebruiker is ingevoerd. De volgende functieaanroep zal het nummer controleren.
Dit is echt een slechte functie! Ja, het controleert of het aantal even is, zoals onze lus, maar het is niet efficiënt. Elke keer dat de gebruiker een oneven getal invoert, wordt de functie in het geheugen vastgehouden en wordt een nieuwe functie aangeroepen. Als je dit vaak genoeg doet, heb je geen geheugen meer!
Gerelateerd: Basisvoorbeelden van Python die u zullen helpen snel te leren
Een praktijkvoorbeeld van een recursieve functie
De bovenstaande voorbeelden waren goede voorbeelden van wanneer recursie niet moet worden gebruikt. Dus, waar wordt recursie gebruikt? Een goed voorbeeld van wanneer u recursie zou willen gebruiken, is zoeken in een binaire boom.
Wanneer gegevens in een binaire boomstructuur zijn gestructureerd, moet u veel paden bewandelen om naar gegevens te zoeken. Op elk punt in de boom moet u beslissen of u rechts of links verder wilt zoeken. Je zou in een variabele kunnen opslaan welk deel van de boomstructuur je hebt bezocht, maar een recursieve functie kan die informatie natuurlijk volgen.
Stel je voor dat we op zoek zijn naar het getal zes in de boom erboven. We zouden een recursieve functie kunnen maken die de boom van links naar rechts doorzoekt. Het algoritme ziet er ongeveer zo uit:
FUNCTION searchTree(branchToSearch) IF find 6 OR end of tree THEN RETURN result ELSE PROCESS branch CALL FUNCTION searchTree(left) CALL FUNCTION searchTree(right) END FUNCTION
In dit pseudocode-voorbeeld zou het algoritme eerst de linkerkant van de boom doorzoeken. Elke keer dat een nieuw nummer wordt bezocht, wordt de functie gepauzeerd en in het geheugen vastgehouden. Hierdoor kunnen we bijhouden waar we zijn geweest.
Het algoritme zal altijd eerst zo ver mogelijk naar de linkerkant zoeken. zodra het het einde van de boom heeft bereikt, wordt de zoekboom (links) voltooid en wordt de rechterkant gecontroleerd. Zodra beide zijden zijn gecontroleerd, wordt er een back-up gemaakt van een tak en wordt de rechterkant gecontroleerd.
Als de algoritmen de hele boom zouden doorzoeken, zou het dit doen in de volgorde:
2, 7, 2, 6, 5, 11, 5, 9 en 4
Kijk of je kunt volgen met behulp van de bovenstaande pseudo-code.
Beoordeling van recursie
Recursie is een geavanceerd onderwerp. Het zal enige tijd duren om het te begrijpen en zelfs nog langer om goed te worden in het coderen. Het helpt als je stap voor stap door recursieve functies loopt. Het kan zelfs helpen om indexkaarten of post-it-notities te stapelen terwijl u een functie doorloopt bij het leren vertegenwoordigen van elke functieaanroep.
Wanneer u een recursieve functie schrijft, begint u met te beslissen hoe u de functie wilt verlaten. Bepaal vervolgens hoe u uw lus instelt. Bepaal welke informatie naar de volgende functieaanroep moet worden verzonden en wat moet worden geretourneerd.
De beste manier om recursie te leren, is door het te oefenen en van je fouten te leren. Bekijk een deel van je oude code en daag jezelf uit om lussen te herschrijven als recursieve functies. Het zal uw code waarschijnlijk niet efficiënter maken, maar het is een goede gewoonte.