Avatar billede perfi Nybegynder
03. januar 2001 - 09:23 Der 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.
Avatar billede borrisholt Novice
03. januar 2001 - 09:27 #1
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.

Jens B
Avatar billede kasseper Nybegynder
03. januar 2001 - 09:28 #2
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.
Avatar billede borrisholt Novice
03. januar 2001 - 09:29 #3
Selvfølgelig kan du lave det med løkker med det er svært ....

Jens B
Avatar billede kasseper Nybegynder
03. januar 2001 - 09:34 #4
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.....
Avatar billede perfi Nybegynder
03. januar 2001 - 09:36 #5
Hej kasseper

Nu er jeg ikke helt klar over hvad der ligger i Fakultetsfunktionen, faktisk kender jeg den ikke.. Kan du ikke komme med et hint..
perfi
Avatar billede beaviz Nybegynder
03. januar 2001 - 09:49 #6
Men det største problem ved rekursive kald er som antydet af borrisholt, at stacken løber fuld på et tidspunkt...
Avatar billede kasseper Nybegynder
03. januar 2001 - 09:50 #7
Fakulteten af et tal udtrykkes ofte ved f.eks. 4!, hvilket vil sige at 4 * 3 * 2 * 1 * 0
( tror jeg nok, det er længe siden jeg lavede den..... )
Avatar billede kasseper Nybegynder
03. januar 2001 - 09:52 #8
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....
Avatar billede beaviz Nybegynder
03. januar 2001 - 09:56 #9
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.
Avatar billede kasseper Nybegynder
03. januar 2001 - 09:59 #10
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.
Avatar billede perfi Nybegynder
03. januar 2001 - 10:19 #11
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??.
Avatar billede beaviz Nybegynder
03. januar 2001 - 10:21 #12
Sikkert meget individuelt, men jeg \"kryber udenom\" - måske er jeg af den gamle skole...
Avatar billede kasseper Nybegynder
03. januar 2001 - 10:22 #13
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....
Avatar billede borrisholt Novice
03. januar 2001 - 10:24 #14
Jeg bruger rekusive kald tit og ofte, men dog mest i forbindelse med implemtering af algoritmer ...

Jens B
Avatar billede perfi Nybegynder
03. januar 2001 - 10:32 #15
Hej

Jeg takker for svarene. Jeg takker af med at give kasseper og borrisholt 30 point hver.

Perfi
Avatar billede cap Nybegynder
03. januar 2001 - 13:05 #16
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester