Vad är ett rekursivt samtal?
Vid programmering är ett rekursivt samtal ett kommando inom en subroutine eller funktion som säger att programmet ska köra samma subroutine igen. Repetitionsprestandan kan vara det direkta resultatet av funktionen, eller en andra funktion kan triggas som i sin tur hänvisar till den första funktionen. Ett rekursivt samtal har vissa likheter med den fruktade oändliga slingan, men subroutinen har alltid ett villkorligt uttalande som säger programmet när man ska sluta upprepa rekursionen.
Rekursionsbegreppet illustreras kanske bäst genom att använda ett exempel. Anta att en takläggare tillämpar nya bältros till ett hem. Till att börja med måste han bära ett bunt bältros till taket. När han har spikat det första buntet på plats måste han klättra nerför stegen, hämta ett annat bunt och spika det på plats. Processen fortsätter som en serie "gå, hämta, återvända" tills den sista bälten har applicerats. Vid den tidpunkten är takläggaren fri att gå vidare till nästa jobb eller åka hem.
Även om exemplet är en överförenkling innehåller det alla elementen i ett rekursivt samtal. Det finns en utgångspunkt, takläggaren måste hämta vad han behöver, återgå till början och, när det slutliga villkoret är uppfyllt, stoppa. Detta är i princip vad programmet gör; den startar, genomför en åtgärd, återgår till sig själv och avslutas när slutbetingelsen inträffar.
Avslutningsvillkoret kallas basfallet. Det är viktigt för alla rekursiva samtal. utan den skulle funktionen fortsätta att upprepas. I bästa fall leder detta till att systemets minnesresurser dräneras. Normalt kommer överbelastningen att krascha programmet vid någon tidpunkt, men när problemet upptäcks kan betydande skador göras.
Erfaren programmerare kanske känner igen likheten mellan ett rekursivt samtal och en "för" eller "medan" slinga. Om till exempel målet är att hitta det totala lagerantalet för alla lager med delnummer större än 999, säger en "för" -slinga programmet att lokalisera alla kvalificerade instanser och en "medan"-loop säger att programmet ska köra slingan endast medan det angivna villkoret är giltigt. Ett rekursivt samtal kan sägas kombinera några av funktionerna i dessa slingor med ett "if-then-else" -uttalande; om detta villkor är sant, gör så, eller annars gör något annat om villkoret är falskt. Rekursion möjliggör emellertid mer kompakt kod, men gör att problemet kan överföras till funktionen närmare den punkt som den behövs.