Datastructuren en algoritmen
Een functie f(x, y) is gedefinieerd als „als y gelijk is aan 0, geef x terug; geef anders f(y, x mod y) terug”. Wat is de teruggegeven waarde van f(84, 36), en hoe vaak wordt f aangeroepen, de eerste aanroep meegerekend?
- AGeeft 12 terug; 3 keer aangeroepen
- BGeeft 12 terug; 4 keer aangeroepen
- CGeeft 6 terug; 3 keer aangeroepen
Antwoord en toelichting tonen
Antwoord: A. Geeft 12 terug; 3 keer aangeroepen
f(84, 36) roept f(36, 12) aan, omdat 84 mod 36 = 12; die roept f(12, 0) aan, omdat 36 mod 12 = 0; en omdat y gelijk is aan 0, wordt 12 teruggegeven. De aanroepen zijn f(84, 36), f(36, 12) en f(12, 0), in totaal drie; dit is het algoritme van Euclides voor de grootste gemene deler. Omdat de functie het resultaat van haar recursieve aanroep direct teruggeeft (staartrecursie), kan een compiler met tail-call-optimalisatie haar omzetten in een lus, zodat ze geen ruimte op de stack blijft gebruiken, hoe diep de recursie ook gaat.