Et ekelt eksempel h e metde sm /** lese e lije f temile * @etu ileste Stig * @excepti IOExcepti i tilfelle i/ pblem public Stig edl() g vil lge e sm /** lese e lije f temile * itil de lese et heltll * @etu ileste tll * @excepti ige utk * t det kmme et heltll /* public it ired() { * Stig s= edl(); * it k= het it f s; * while (! lt k) * gjet: k = het it f este lije; * etu k; /* public it myred() { * Stig s= edl(); * it k= het it f s; * if (lt k) etu k; * else // pøv este lije * etu myred(); public it myred() { ty{ etu Itege.pseIt(edl()); ctch(ioexcepti e) { etu myred(); ctch(numbemtexcepti e) { etu myred(); i- : H- 5. Rekusj: Rekusj I. TRE AV REKURSIVE KA, ekusjsdybde temieig dig II. INDUKTIVE DATA TYPER g Rekusj ve slike III. SPITT OG HERSK PROBEMØSNING VED REKURSJON (Kp. 8..) IV. REKURSJONS EEKTIVITET memiseig vskjæig V. STABE AV REKURSIVE KA itesj til ekusj ekusj implemetet sm itesj VI. KORREKTHET temieig ivite (tt til Kgdhl&Hvee) i- : H- 5. Rekusj:
. Rekusjste g -dybde; Eks: ibcci-tllee fib() = fib() = fib() = fib() fib() f() f() f() f() f() f(4) 5 f() public it fib(it ) { if (== ==) etu ; else etu fib(-) fib(-); etue i bsistilfelle f() f() elles beeg ekusivt eklee (mide) dele g sett disse smme te v ekusive kll f(4)...? f()...? ekkefølge f()...? v kll f()...? > f()...? > > f()...? > > f()...? f()...? > f()...? > > > 5 ekusjsdybde #svte = #øde lije = # ekusive kll... itil bsistilfelle e ådd (=høyde v teet) i- : H- 5. Rekusj: 4 Itesj til ekusj /** @pm > @etu... it sumw(it ) { it es =; while ( > ) { es = es ; = ; etu es; /** @pm > @etu... it sumr(it ) { if ( == ) etu ; else etu sumr(-); Geeellt, dg ikke % iktig: it Ite(it ) { es= iit; while ( ftsett() ) { es= Kppe(,es); ppdte(); etu es; it Rekusiv(it ) { if (!ftsett() ) etu bsetilfelle; else etu Kppe(, Rekusiv(ppdte())); Ehve itesj k skives sm ekusj... t..m. sm hle-ekusj i- : H- 5. Rekusj:
Visje ve tem iduktiv defiisj = f bsis g ppve ***** ekusj = f tppe mt bsis N it fib() { it sum(k) { bsis: if (== ==) etu ; if (k==) etu ; id: else etu fib(-) fib(-); else etu k sum(k-); Ay[N] vid ic(an A, it k) { it sum(an A, it k) { bsis: [] -> N A[k]; if (k==) etu A[]; id: [.. k, k] -> N if (k > ) ic(a,k-); else etu A[k] sum(a,k-); iste[n] clss S { vid ic(s ) { it sum(s ) { bsis: ull it hdedt; if (==ull) { if (==ull) etu ; id: (,) S estliste; else { hdedt; else etu sum(.estliste)hdedt; ic(.estliste); BiætTe[N] clss BT { vid ic(bt B) { it sum(bt T) { bsis: ull it ; if (T==ull) { if (T==ull) etu ; id: (t,,t) BT left; else { ; else etu BT ight; ic(t.left); sum(t.left) ic(t.ight); sum(t.ight) ; RAKTAe i- : H- 5. Rekusj: 6. Iduktive Dt Type (vilkålig ste me edelige) Stuktuell deig tulige tll N: y v N: A(N) bsis: e et N bsis -> N e A(N) hvis e et N hvis [...k] -> N e A(N) så e: et N så e [...k,k] -> N e A(N) iste v N: (N): bsis: hvis så e: ull e e (N) e (N) g e N (,) e (N) N... N k k N... N k... N k k Biæe Tæ v N: BT(N): bsis: ull e et BT(N) hvis t, t e BT(N) g e N t t t, t så e: (t,, t) et BT(N) t t t t i- : H- 5. Rekusj: 5
/* SS - stee iput y (SeleksjSt) * @pm - it tb[...] * @etu - stet tb * * f (k =,,...) { * i = k * f ( j = k...) * if (tb[j] tb[i]) i = j; * bytt elemetee ved ideks k g i * Itetivt eksempel: Seleksjsteig f e vlikålig iput tbell med legde : utføe itesje (f k=,...) g i hve itesj gå gjem sluttsegmet [k...], (f j=k...), dvs. tidskmpleksistet SS() ( = ) k = ( ) k = = ( ) = O( ) i- : H- 5. Rekusj: 8 E tekisk bemekig iste v N: [N]: bsis: ull e e [N] hvis e [N] g e N så e: (,) e [N] Rekusj implemetet utef dtstuktue : clss N { ic(n ) { it sum(n ) { public it hdedt; if (==ull) { if (==ull) etu ; public N estliste; else {.hdedt; else etu sum(.estliste).hdedt;... ic(.estliste); clss N { pivte it hdedt; pivte N estliste; ic() {... it sum() {... elle ief dtstuktue : ic() { it sum() { hdedt; if (estliste!= ull) if (estliste!= ull) etu estliste.sum()hdedt; estliste.ic(); else etu hdedt; ic(n ) { it sum(n ) { if (!= ull) if (!= ull).ic(); etu.sum(); else etu ; i- : H- 5. Rekusj: 7
Rekusivt eksempel:megest /* - flette t stete y: * @pm - it t[...], t[...] - stete * @etu - stet t[...] * gå (smtidig) gjem t g t (med i g i) * if t[i] t[i] plsse t[i] i t g øk i, i * else plsse t[i] i t g øk i, i * hvis e igje i t elle t, flytt det til t * etu t; (,) = O () /* MS - stee iput y: * @pm - it tb[...-] * @etu - stet tb * if ( == ) etu tb * else { k= /; * etu ( MS(tb[...k]), MS(tb[k..-]) ); = / / = /4 /4 /4 /4 =........................... = lg () MS() = O ( * lg () ) = = i- : H- 5. Rekusj: i- : H- 5. Rekusj: 9
. Splitt g hesk (eg: Divide d Cque) Rekusj sm e geeell sttegi f pblemløsig g lgitmedesig Gitt e ists v et pblem P :. hv gjø jeg å e bsis tilfelle. hvd kstuee løsig f utf løsige f e istse mide e P = ste iput y A ( = A.legth) /* it[] SS(it[] A,k) { * iitielt kll med SS(A,) * = A.legth; * if (k==-) { etu A; * else { * i= idekse til miste elemetet * i A[k...-]; * bytt A[k] med A[i]; * etu SS(A, k); O ( ) O (*lg ) /* it[] MS(it[] A) { it = A.legth; * if ( == ) { etu A; * else { del A i midte i * t= A[.../] g t= A[/...lgh]; * ste ekusivt begge (mide) * = MS(t) g = MS(t) * etu flettet esultt v ekusive kll (,) * - flette t stete y i e stet y P = fi et gitt elemet x i e y A Hvis A e ustet : sjekk A[]; hvis x ikke e de, lett i A[... ] Hvis A e stet... O () i- : H- 5. Rekusj: MS[ 4 5] MS t[...] if ( == ) etu t; else k= /; etu ( MS t[...k], MS t[k...]) MS[ 4] MS[ 5] MS[] MS[4] MS[] MS[ 4] MS[] MS[5] [] [5] [ ] - [5] [] - [ ] 5 5 [] [4] [] [ 5] [ ] - [4] [] - [ ] [ 4] 4 4 [ ] - [ 5] [] - [ ] [ 5] 5 [ 4] - [ 5] [4] - [ 5] [ 4] - [ 5] [ 4] - [ 5] [ ] - [ 5] [ ] - [ ] 4 4 5 5 ttlt: 7 5 = [ 4 5]
4. Rekusj g effektivitet Reduse tll ekusive kll it fib(it ) { if (== ==) etu ; else etu fib(-)fib(-); O(.6 ) f() f() f() f() f() f(4) f() f() f(). Memiseig : Istedef gjettte ekusive kll til f(k) med smme k, k i dette tilfelle esulttet v f(k) lges f seee buk: it ib(it ) { O() it[] = ew it[]; []=; []=; f(4) etu fib(, ); it fib(it, it[] ) { if ([] > ) { etu []; else { it z= fib( ) fib( ); []= z; etu z; f() f() f() f() i- : H- 5. Rekusj: 4 Biæ Søk /* fi ideks i A til et elemet x: it BS(it[] A,x,l,h) { * @pm A it A[...] stetit m= (lh) / ; * @pm x fi x i A if (l > h) etu -; * @pm l, h søk i A be fm. l tm. h else if (A[m] == x) etu m; * @etu ideks til x; else if (A[m] x) etu BS(A,x,m,h); * hvis x ikke fies else etu BS(A,x,l,m-); // iitielt kll med BS(A, x,, A.legth ) Nøkkel e 48 O (lg ). kll. kll. kll bisøk(a, 48,, 9) bisøk(a, 48, 5, 9) bisøk(a, 48, 5, 6) [] [] [] [] [4] [5] [6] [7] [8] [9] A[] 9 4 48 5 55 7 99 l = m = (9)/ h = 9 [] [] [] [] [4] [5] [6] [7] [8] [9] A[] 9 4 48 5 55 7 99 l = 5 m = (59)/ h = 9 [] [] [] [] [4] [5] [6] [7] [8] [9] A[] 9 4 48 5 55 7 99 l = 5 h = 6 bsis tilfelle m = (56)/ A[m] == økkel etu 5 i- : H- 5. Rekusj:
5. Rekusj implemetet med stbel... ib k vi buke f.eks. stble (gumet), p(pet), e(esultt) it ib(it ) { if (== ==) etu ; else etu ib(-) ib(-); f() f(4) f() 4 f() f() f() f() f() f() 5 5 i- : H- 5. Rekusj: 6 Kmpleksitet v e ekusiv fuksj Alyse vh REKURSJONSTRE vhege v støelse på steget i hvet ekusivt kll (høyde v teet) tll ekusive kll i hvet steg ( bedde v fgeige) beidsmegde ved smmesettig v esultte f ekusive kll. At dette O() i eksemplee ude. R() h ekusive kll til R(-) R() = R() R() O( ) h= R() h ek kll til R(-) g R(-) R() = R() R() O(.6 ) 4 h= R() h ekusive kll til R(-) R() = R() R() R() O( ) ibcci k dg fekles til: O() 4 h= R() h ek. kll til R(/) R() = R(/) R(/) R() h ek. kll til R(-) R() = R() c O() h= lg() = -=O() h= f (/) (/4) (/8) i- : H- 5. Rekusj: 5
6. Kekthet Gitt e ists v et pblem P :. hv gjø jeg å e bsis tilfelle. hvd kstuee løsig f utf løsige f e istse mide e P() if Bsis() etu??? else etu Kmbie(P(m)... P(mk)) Temieig: P() if Bsis() stppe ekusj else gte t hve mi, e æmee Bsis kmbisj ppetthlde ekusjs-ivit Kekthet: P() if Bsis() ktlle kekt utføelse else HER MÅ VI VISE HVIS -> SÅ HVIS hvet ekusivt kll P(mi) etuee iktig esultt!!! DET OVENSTÅENDE ANTAR VI!!! SÅ gi Kmbie(P(m)... P(mk)) iktig esultt i- : H- 5. Rekusj: 8 Rekusj til itesj (k lltid mgjøes v.hj.. Stbel) it fibs(it ) { Stig ; it,, ; Stck p = ew StckImp(); Stck e = ew StckImp(); it ib(it ) { if (== ==) etu ; else etu ib(-) ib(-); Ne ekusje (f.eks. hle-ekusj) k mgjøes til itesj på e eklee måte. Stck = ew StckImp(); p.push( );.push( ew Itege() ); while (!p.empty()) { = (Stig) p.pp(); if (.equls( ) ) { = ( (Itege).pp() ).itvlue(); if (== ==) e.push( ew Itege() ); else { p.push( ); p.push( ); p.push( );.push( ew Itege(-) );.push( ew Itege(-) ); else if (.equls( ) ) { = ( (Itege)e.pp() ).itvlue(); = ( (Itege)e.pp() ).itvlue(); e.push( ew Itege() ); etu ( (Itege)e.pp() ).itvlue(); i- : H- 5. Rekusj: 7
økke-ivit it sum(it ) { if ( == ) etu ; bsis gi iktig sum() = else etu sum( ); hvis sum( ) gi iktig = i så e sum() = sum( ) = i = = i i it sumw(it ) { it i=, =; while (i!= ) { = i; i; // = i, i =i... b. økke-ivit, I: = Iitiliseig: i= & = = hvis I: = i = k k så hlde I : = i = k k i = k => I = k hlde fø kppe i' = k k ette kppe it sumw(it ) { it i=, =; while (i!= ) { i; = i; // i = i, = i etu ; 4. i Utgg: I: = k & i = => = k k = k = etu ; i- : H- 5. Rekusj: Kekthet: ekusjs-ivit /* it[] MS(it[] A) { it = A.legth; * if ( == ) { etu A; * else { * del A i midte i : * t= A[.../] g t = A[/...]; * ste ekusivt (mide) delee * = MS(t) g * = MS(t) * etu flettet esultt v * ekusive kll (,) Ivit: MS(A) etuee stet gumet A: if lgh== d e A stet else dele A i t disjukte dele t= A[.../] g t= A[/...] = MS(t) etuee stet t = MS(t) etuee stet t hvis flette kekt t stete y, så etuee hele else-gee stet A /* it BS(it[] A, it x, it l, it h) { * it m= (lh) / ; * if (l > h) etu ; * else if (A[m] == x) etu m; * else if (A[m] x) etu BS(A, x, m, h); * else etu BS(A, x, l, m ); Ivit: gumetet A e stet & e x i A, så e de mellm [l... h] (iitielt kll med (A, x,, A.legth-) if l > h x k ikke væe de ( e iktig) else if A[m] = x d h vi fuet de (m e iktig) else if A[m] x e x i A, så må de væe mellm [m... h] BS(A, x, m, h) vil etuee iktig esultt else A[m] > x e x i A, så må de væe mellm [l... m ] BS(A, x, l, m ) vil etuee iktig esultt i- : H- 5. Rekusj: 9
økke-ivit: eksempel. /** beege støste felles divis @pm x > @pm x > @etu y = gcd(x,x) gcd(x,x) { y= x; y= x; iitiliseig: x = y & x = y gcd(x,x) == gcd(x,x) while (y!= ) { if (y y) (y,y) = (y,y); else // (y >= y) I: gcd(y,y) = gcd(x,x) t t de gjelde he gcd(x,x) = gcd(y,y) = gcd(y,y) = gcd(y,y ) y= y y; gcd(x,x) = gcd(y,y) = gcd(y,y-y) = gcd(y,y ) etu y; I : cd(y,y ) = gcd(x,x) utgg: I & y = gcd(x,x) = gcd(y,y) = gcd(,y) = y Hvis gcd(y,y) = z >= & y >= y, så *) y = z*k = z*k = y & gcd(k,k) = Me d: y = y y = z*(k k) & gcd(k, k k) = hvis ikke, dvs. gcd(k,k k) = v >, d k= v* & k k= v*b, så k= v*bv* = v*(b) dvs. d gså gcd(k,k) = v > mtsie *) i- : H- 5. Rekusj: økke-ivit: eksempel. /** beege heltlls kvsiet smt este @pm x >= @pm y > @etu (q, ) s. x= q*y & = y & = q div(it x, it y) { it q = ; it = x ; iitiliseig: q = & = x >= x= q*y & = & = q while (y = ) { I: = & x = q*y & = q t t de gjelde ved igg, smt y = q = q ; = y; d gjelde, ette løkkekppe: q = q & = q = q & = y & = & y = = q *y = (q)*y ( y) = q*y y y = q*y = x dvs. I ppetthldes gjem kppe utgg f løkke: I & y x = q*y & = y & = q etu (q, ) ; i- : H- 5. Rekusj:
Oppsummeig. Rekusj Splitt g hesk bestem hv sm må gjøes i bsis tilfelle() kstue ( hesk ) e løsig f (ekusive) løsige f ( splitt ) e mide istse. Ehve iduktiv dttype (t, it, liste, tæ,...) gi pphv til ekusive lgitme. Rekusj vs. itesj (ekusj implemetees itetivt med buk v stbel) 4. Kmpleksitet v ekusiv fuksj vhege v tll de i ekusjste ( splitt ) dybde (høyde) v teet hv stt steg mt bsis utgjø hve splittig tll ekusive kll (bedde v teet) på hvet ivå beidsmegde f å kstuee e løsig utf løsige f mide istse ( hesk ) 5. Kekthet bestem ekusjs-ivite veifise t bsistilfelle() etblee ivite ude tkelse t ekusive kll etblee ivite, vis t kstuksje vil ppetthlde de bestem løkke-ivit vis t de gjelde ette iitiliseig (like fø igge i løkke) ude tkelse t de gjelde fø løkkekppe, vis t de gjelde gså ette dee i- : H- 5. Rekusj: