rekursion:
i programmeringstermer kan en rekursiv funktion definieras som en rutin som kallar sig direkt eller indirekt.
med rekursiv algoritm kan vissa problem lösas ganska enkelt. Towers of Hanoi (TOH) är en sådan programmeringsövning. Försök att skriva en iterativ algoritm för TOH. Dessutom kan varje rekursivt program skrivas med iterativa metoder (se datastrukturer av Lipschutz).
matematiskt rekursion hjälper till att lösa några pussel lätt.,
till exempel en rutinmässig intervjufråga,
i ett parti av n-personer, kommer varje person att skaka sin hand med varandra endast en gång. Totalt hur många handskakningar skulle hända?
lösning:
det kan lösas på olika sätt, grafer, rekursion, etc. Låt oss se, hur rekursivt det kan lösas.
Det finns N personer. Varje person skakar hand med varandra bara en gång. Med tanke på N: te person, (s)han måste skaka hand med (N-1) personer. Nu problemet reduceras till små instans av (N-1) personer. Förutsatt TN som total shake-hands, det kan formuleras rekursivt.,
TN = (N-1) + TN-1
att lösa det rekursivt ger en aritmetisk serie, som kan utvärderas till N(N-1)/2.
övning: i ett parti av N par, bara ett kön (antingen man eller kvinna) kan skaka hand med var och en. Hur många shake-hands skulle hända?
vanligtvis rekursiva program resulterar i dålig tid komplexitet. Ett exempel är Fibonacci-serien. Tidskomplexiteten för att beräkna n-th Fibonacci-nummer med rekursion är ungefär 1,6 n. det betyder att samma dator tar nästan 60% mer tid för nästa Fibonacci-nummer. Rekursiv Fibonacci algoritm har överlappade subproblem., Det finns andra tekniker som dynamisk programmering för att förbättra sådana överlappade algoritmer.
men få algoritmer, (t.ex. sammanfoga Sortera, snabb sort, etc…) resulterar i optimal tid komplexitet med rekursion.
basfall:
ett kritiskt krav på rekursiva funktioner är termineringspunkt eller basfall. Varje rekursivt program måste ha basfall för att se till att funktionen kommer att avslutas. Saknade basfall resulterar i oväntat beteende.,
olika sätt att skriva rekursiva funktioner
Funktion kallar sig själv: (direkt sätt)
de flesta av oss medvetna minst två olika sätt att skriva rekursiva program. Nedan ges torn av Hanoi kod. Det är ett exempel på direkt kallelse.
utgång:
Move the disk 1 from S to DMove the disk 2 from S to AMove the disk 1 from D to AMove the disk 3 from S to DMove the disk 1 from A to SMove the disk 2 from A to DMove the disk 1 from S to D
tidskomplexiteten hos TOH kan beräknas genom att formulera antal drag.
vi måste flytta de första N-1-skivorna från källa till hjälp och från hjälp till Destination, dvs de första N-1-skivorna kräver två drag. Ytterligare ett drag av sista disken från källa till Destination., Matematiskt kan det definieras rekursivt.
MN = 2MN-1 + 1.
vi kan enkelt lösa ovanstående rekursiva relation (2N-1), som är exponentiell.
rekursion med ömsesidig funktion call: (indirekt sätt)
indirekt calling. Även om det är minst pratiskt kan en funktion anropa en annan funktion som inturn anropar tidigare funktion. I detta fall bör båda funktionerna ha basfodralet.
defensiv programmering:
vi kan kombinera defensiva kodningstekniker med rekursion för graciös funktionalitet ansökan., Vanligtvis är rekursiv programmering inte tillåten i säkerhetskritiska applikationer, såsom flygkontroller, hälsoövervakning etc. Man kan dock använda en statisk räkningsteknik för att undvika okontrollerade samtal (inte i säkerhetskritiska system, kan användas i mjuka realtidssystem).
callDepth djup beror på funktion stack ramstorlek och maximal stack storlek.
rekursion med function pekare: (indirekt sätt)
rekursion kan också genomföras med funktion pekare. Ett exempel är signalhanterare i POSIX klagomålssystem., Om hanteraren orsakar att utlösa samma händelse på grund av vilken hanteraren kallas, kommer funktionen att återinträda.