03. januar 2001 - 09:23Der er
14 kommentarer og 2 løsninger
Rekursivt kald
Hej der...
Jeg ved godt det måske lyder lidt åndet, men hvad er forskellen/fordelen ved et rekursivt kald og en almendelig løkke som udføre det samme?. Er det hurtigere?. Spare man kodning?. Jeg har set det mest i binære søgetræer. Er der andre steder det vil være en fordel at benytte kaldet eller hva\'? Jeg vil være glad for et lille eks. på en typisk anvendelse af en rekursiv funktion.
Rekusive kald er langsommere end en alm løkke, fordi man hele tiden skal smide en masse på stacken .. Fordelen vel re´kusive kald er at de er meget logiske i forhold til den matematiske verden ....
Prøv fx. at tænke på den klasiske (?) findfirst .. findnext ... findclose algoritme den er som aftes rekusiv implemteret fordi det svarer meget godt til virkeligheden ude på din harddisk.
Der er ting du kan lave med rekursivitet, som du ikke kan med løkker. Fakultetsfunktionen er et typisk eksempel, hvor man ville skulle bruge væsentlig mere kode i en løkke end hvis man bruger rekursivitet.
Ja og et gevaligt roderi. Desuden er jeg ikke enig med dig i et et rekursivt kald er langsommere end en løkke. Hvis man skal gemme alle oplysninger i en løkke for hver gang, ligesom det rekursive kald gør det på stacken, så vil det højst sandsynligt være det rekusive kald der er hurtigst. Da det så er Fortolkeren/kompileren der søger for at gemme værdierne, mens i løkken skal du selv lave din lagring.....Hvis du er sej, kan du gøre det med samme tid som kompileren, men det kræver en gevalig indsigt i programmeringssproget.....
beaviz >> korrekt, men det er ikke ensbetydende med at funktionen er langsommere, ofte er lagerallokering som man selv bruger ved manuel lagring, MEGET langsomere end stack adgang....
kasseper: gange 0 ? :)) nej, jeg var også lidt for hurtig til at referere til borrisholt, men min pointe var egentligt også bare at der er et loft for hvor mange rekursioner der kan laves.
Nok gik det stærkt men definitions mæssigt er det sådan at 0! = 1, det er en vedtægt, Det slår mig lige at det vist er sådan her : 4! = 4 * 3! * 2! * 1! * 0!.....også skulle den være god nok ;) Og det med loftet, er nemlig rigtigt, hvilket også er grunden til at der ikke er så mange systemer der kan klare meget mere en 12! så vidt jeg husker.
Er det en fordel at bruge et rekursivt kald hvergang der er ladesiggøreligt?. Nu skal jeg ikke bruge rekursivt kald til at lave f.eks. Tower of Hanoi, men mere praktisk envendelige funktioner der skal evalueres. Mit sidste spørgsmål til jer er...Bruger i selv rekursive kald meget eller er det teori man i praksis kryber uden om??.
Brug rekusion hvor du syntes at det kan lette dit arbejde. Du bør dog overveje om det vil kunne føre til et stack overflow. Jeg bruger det hver gang det er muligt og hver gang mine overvejelser omkring tid og størrelse tillader det. I Praksis er det min erfaring at det bruges meget, men igen med forbehold for sikker kode....
En rekursiv procedure er en procedure der så at sige kalder sig selv. Det er som de andre siger at en af mulighederne for at bruge den er til fakultets funktion. Altså 5! som igen betyder 5*4*3*2*1. Her er funktionen glimrende da den regner helt ned til 5*1 og så lægger de resultater den har fundet sammen på vejen \"op\" igennem den rekursive procedure eller funktion.
int main() { long no; long faktorial(); cout<<\"Indtast tallet du gerne vil have i fakultet\"; cin>>no; cout<<endl;
cout<<\"Resultat af fakultet af \"<<no<<\" er: \"<<faktorial(no)<<endl;
}
long faktorial(n) {
if n =0 return 1; elseif n=1 return 1; else return n*faktorial(n-1); endif }
Jeg har ikke checket om den kan kompileres men det skulle den vist.
Carsten
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.