Fibonacci som rekursiv

Tags:    rekursion java programmering fibonacci matematik

<< < 12 > >>
Hej allesammen

Jeg har fået stillet en opgave, eller nærmere to opgaver, men den første har jeg løst. Opgaverne lyder:
1. Lav en metode der benytter en løkke til at finde fibonacci nummeret ud fra en given't term/nummer. Metoden skal returnere værdien som en long.
2. Lav nu den samme metode, men denne gang skal du benytte rekursion til at løse opgaven.

Jeg har løst opgave 1 på følgende måde:
Fold kodeboks ind/udJava kode 

Mit problem er nu at jeg ingen ide har til hvad jeg skal gøre for at lave metoden rekursiv. Ved godt at rekursion er noget med at metoden kalder sig selv, men kan bare ikke lige greje hvordan jeg løser den.

Håber at der er nogle der kan hjælpe mig :)



20 svar postet i denne tråd vises herunder
15 indlæg har modtaget i alt 23 karma
Sorter efter stemmer Sorter efter dato
Din metode kalder ikke sig selv indtil "base case" rammes



Hvis i vil sammenligne rekursion og løkker er det vel rimelig relevant, at i faktisk foretager det samme.

Løkken starter ved fib 3 til fib n. Mens rekursionen starter ved fib n til fib 1.

Så hvis i vil sammenligne burde i starte rekursionen ved fib 3 og rekursere op ad. (Burde være muligt.)

noget i retning af dette (javascript udgaven):

Fold kodeboks ind/udKode 


Har du iøvrigt prøvet at teste din løkke med:
fibonacci(1)
fibonacci(2)
Tror ikke det vil give dig 1, men derimod 0.



Dejligt med denne tråd.... Jeg lærer faktisk noget her :P



@Robert - Rekursion stammer mere eller mindre fra den matematiske måde at tænke på tingene på. Hvis du synes det er rart at arbejde med bør du prøve at udforske nogle af de funktionelle sprog der findes. Hvis man godt kan lide den matematiske tankegang der findes, og således godt kan lide at vende problemerne lidt om (som man fint kan argumentere for at den simple rekursive løsning på fibbonacci er ifht. den iterative løsning) - så findes der altså nogle sprog som er herlige at skrive i. Jeg er selv i færd med at lave en compiler i Ocaml som en del af min uddannelse - og jeg synes godt nok at jeg bliver mere og mere glad for sproget jo mere jeg skriver i det. Desværre kan man godt mærke at compileren ikke er helt så optimeret ifht. fejl beskeder - men selve sproget må jeg indrømme jeg er blevet glad for.



@Kaare Helt enig. Funktionelle sprog er da ganske sjove, og har også leget lidt med Clojure men stoppede pga. tidsmangel.
Skal dog tage det op igen på et tidspunkt.



Hej Jens, Din metode er jo ikke rekursiv?? eller??

Martin: Tak, det var lige det jeg havde brug for. Forresten hvad er egentlig forskellen ved metoden med løkker og metoden med rekursion?



Martin > Okay, jeg er med. Min kodestil er bare generelt at jeg undgår at kalde den samme metode inde i sig selv, ved ikke hvorfor jeg har fået denne opfattelse..



Rekursion og løkker er to forskellige måder at arbejde på, så nej, det vil ikke (nødvendigvis) være relevant at begge tæller op.

Din rekursive metode er bestemt mere optimal end de tidligere, men den er også tættere op ad løkken, som vil være mere logisk at bruge...og en smule hurtigere og vil bruge hukommelsen bedre.

Man kan også traversere en træstruktur uden rekursion, men her er rekursion typisk bare en meget elegant metode, mens en løkke ville blive ret kompleks. Traversering af et array eller kædet liste, vil derimod blive bedst med en løkke frem for rekursion.



hehe...så er vi enige jens :-)


Nu har der været en del kritik af rekursion i denne tråd, så jeg vil lige give min dybeste respekt til ham som fandt på det. Rekursion er fandeme en elegant teknik, men ligesom med alle andre teknikker skal man vide, hvordan den virker, for at kunne bruge den korrekt, og for at vide, hvor den bør og ikke bør bruges.



Jeg har haft en opgave der ligner meget, og såvidt jeg ved, så skal man bruge det forgående resultat, og ligge sammen med det tal du er i gang med at behandle, så jeg synes din kode ser fin ud, dog mangler der ligesom en start, som beskriver hvad dine start-værdier er.

Fold kodeboks ind/udJava kode 




<< < 12 > >>
t