Hvad er et rekursivt opkald?
Ved programmering er et rekursivt opkald en kommando inden for en subroutine eller en funktion, der fortæller, at programmet skal køre den samme subroutine igen. Gentagelsespræstationen kan være det direkte resultat af funktionen, eller en anden funktion kan udløses, som igen henviser til den første funktion. Et rekursivt opkald har nogle ligheder med den frygtede uendelige sløjfe, men subroutinen har altid en betinget erklæring, der fortæller programmet, hvornår man skal stoppe med at gentage rekursionen.
Rekursionskonceptet illustreres måske bedst ved hjælp af et eksempel. Antag, at en tagdækning anvender nye helvedesild på et hjem. For at begynde med skal han bære et bundt helvedesild op på taget. Når han har spikret det første bundt på plads, skal han klatre ned ad stigen, hente et andet bundt og sømme det på plads. Processen fortsætter som en serie af "gå, hente, vende tilbage", indtil den sidste helvedesild er blevet anvendt. På det tidspunkt er rooferen fri til at gå videre til det næste job eller gå hjem.
Selvom eksemplet er en forenkling, indeholder det alle elementerne i et rekursivt opkald. Der er et udgangspunkt, tagdækkeren skal hente det, han har brug for, vende tilbage til begyndelsen og stoppe, når den endelige betingelse er opfyldt. Dette er dybest set, hvad programmet gør; den starter, implementerer en handling, vender tilbage til sig selv og afsluttes, når sluttilstanden opstår.
Afslutningsbetingelsen omtales som basissagen. Det er vigtigt for alle rekursive opkald; uden den fortsætter funktionen med at gentage. I bedste fald resulterer dette i dræning af systemets hukommelsesressourcer. Normalt vil overbelastningen ødelægge programmet på et tidspunkt, men på det tidspunkt, hvor problemet opdages, kan der være betydelig skade.
Erfarne programmerere genkender måske ligheden mellem et rekursivt opkald og en "for" eller "while" -sløjfe. Hvis for eksempel målet er at finde det samlede lagerantal for alle lagre med varenumre større end 999, fortæller en "for" -sløjfe programmet til at finde alle kvalificerende instanser og en "mens" -sløjfe fortæller programmet at udføre loopen kun mens den angivne betingelse er gyldig. Det kan siges, at et rekursivt opkald kombinerer nogle af funktionerne i disse sløjfer med en "if-then-else" -sætning; Hvis denne betingelse er sand, skal du gøre dette, eller ellers gøre noget andet, hvis betingelsen er falsk. Rekursion tillader imidlertid typisk mere kompakt kode og tillader, at problemet overføres til funktionen nærmere det punkt, det er nødvendigt.