Reusj I. TRE AV REKURSIVE KA, eusjsdybde temieig dig II. INDUKTIVE DATA TYPER g Reusj ve slie III. SPITT OG HERSK PROBEMØSNING VED REKURSJON (Kap. 8..) IV. REKURSJONS EEKTIVITET dyamis pgammeig avsjæig V. STABE AV REKURSIVE KA iteasj til eusj eusj implemetet sm iteasj VI. KORREKTHET temieig ivaiate (tat til Kgdahl&Haveaae) Demed fedig med geeell basis i- : H-99 4. Reusj: Et eelt esempel ha e metde sm /** lese e lije fa temiale * @etu ileste Stig * @excepti IOExcepti i tilfelle i/ pblem public Stig eadl() g vil lage e sm /** lese e lije fa temiale * itil faa et heltall * @etu ileste tallet * @excepti ige uta * det mme et heltall /* public it iread() { * Stig s= eadl(); * it = het feste it fa s; * while (! alt ) * gjeta: = pev este lije; * etu ; /* public it myread() { * Stig s= eadl(); * it = het feste it fa s; * if (alt ) etu ; * // pev igje med este lije * etu myread(); public it myread() { ty{ etu Itege.paseIt(eadl()); catch(ioexcepti e) { etu myread(); catch(numbematexcepti e) { etu myread(); i- : H-99 4. Reusj:
Iteasj til eusj /** @paam > @etu... it sumw(it ) { it es =; while ( > ) { es = es ; = ; etu es; /** @paam > @etu... it sumr(it ) { if ( == ) etu ; etu sumr(-); Gvt g ie % itig sagt: it Ite(it ) { es= iit; while ( ftsett() ) { es= Kppe(,es); ppd(); etu es; it Rec(it ) { if (!ftsett() ) etu iit; etu Kppe(, Rec(ppd())); Ehve iteasj a sives sm eusj... t..m. sm hale-eusj i- : H-99 4. Reusj:. Reusjste g -dybde fib() = fib() = fib() = fib() fib() f() f() f() f() f() f(4) 5 f() public it fib(it ) { if (== ==) etu ; etu fib(-) fib(-); etue i basistilfelle f() f() elles beeg eusivt elee (mide) dele g sett de samme te av eusive all f(4)...? f()...? eefølge f()...? av all f()...? > f()...? > > f()...? > > f()...? f()...? > f()...? > > > 5 eusjsdybde #svate = #øde lije = # eusive all... itil basistilfelle e ådd (=høyde av teet) i- : H-99 4. Reusj: 4
. Idutive Data Type (vilålig ste me edelige) Stutuell deig atulige tall N: aay av N: A(N) basis: e et N basis -> N e A(N) hvis e et N hvis [...] -> N e A(N) så e: et N så e [...,] -> N e A(N) iste av N: (N): basis: ull e e (N) hvis så e: e (N) g e N (,) e (N) N... N N... N... N Biæe Tæ av N: BT(N): basis: 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-99 4. Reusj: 5 Vaiasje ve tema idutiv defiisj = fa basis g ppve eusj = fa tppe mt basis N it fib() { it sum() { basis: if (== ==) etu ; if (==) etu ; id: etu fib(-) fib(-); etu sum(-); Aay[N] vid ic(an A, it ) { it sum(an A, it ) { basis: [] -> N A[]; if (==) etu A[]; id: [.., ] -> N if ( > ) ic(a,-); etu A[] sum(a,-); iste[n] class T { vid ic(s ) { it sum(s ) { basis: ull it ; if (==ull) { if (==ull) etu ; id: () T xt; { ; etu sum(.ext); ic(.xt); BiætTe[N] class BT { vid ic(bt B) { it sum(bt T) { basis: ull it ; if (T==ull) { if (T==ull) etu ; id: (t,,t) BT left; { ; etu BT ight; ic(t.left); sum(t.left) ic(t.ight); sum(t.ight) ; RACTAe i- : H-99 4. Reusj: 6
E teis bemeig iste av N: [N]: basis: ull e e [N] hvis e [N] g e N så e: (,) e [N] Reusj implemetet utefa datastutue : class N { ic(n ) { it sum(n ) { public it ; if (==ull) { if (==ull) etu ; public N xt; {.; etu sum(.ext).;... ic(.xt); class N { pivate it ; pivate N xt; ic() {... it sum() {... elle ief datastutue : ic() { it sum() { ; if (xt!= ull) if (xt!= ull) etu xt.sum(); xt.ic(); etu ; ic(n ) { it sum(n ) { if (!= ull) if (!= ull).ic(); etu.sum(); etu ; i- : H-99 4. Reusj: 7. Splitt g hes Reusj sm e geeell stategi f pblemløsig g algitmedesig Gitt e istas av et pblem P :. hva gjø jeg å e basis tilfelle. hvda stuee løsig f utfa løsige f e mi P = ste iput aay A ( = A.legth) /* it[] SS(it[] A,) { * iitielt all med SS(A,) * = A.legth; * if (==-) { etu A; * { * i= idese til miste elemetet * i A[...-]; * bytt A[] med A[i]; * etu SS(A, ); O ( ) O (*lg ) /* it[] MS(it[] A) { it = A.legth; * if ( == ) { etu A; * { del A i midte i * t= A[.../] g t= A[/...lgh]; * ste eusivt begge (mide) * = MS(t) g = MS(t) * etu flettet esultat av eusive all (,) * - flette t stete aay i e stet aay P = fi et gitt elemet x i e aay A Hvis A e ustet : sje A[]; hvis x ie e de, lett i A[... ] Hvis A e stet... O () i- : H-99 4. Reusj: 8
Biæ Sø /* fi ides i A til et elemet x: it BS(it[] A,x,l,h) { * @paam A it A[...] stetit m= (lh) / ; * @paam x fi x i A if (l > h) etu -; * @paam l, h sø i A bae fm. l tm. h if (A[m] == x) etu m; * @etu ides til x; if (A[m] x) etu BS(A,x,m,h); * hvis x ie fies etu BS(A,x,l,m-); // iitielt all med BS(A, x,, A.legth ) Nøel e 48 O (lg ). all. all. all bisø(a, 48,, 9) bisø(a, 48, 5, 9) bisø(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 basis tilfelle m = (56)/ A[m] == øel etu 5 i- : H-99 4. Reusj: 9 4. Reusj g effetivitet Reduse atall eusive all it fib(it ) { if (== ==) etu ; etu fib(-)fib(-); f() f() f() f() f() f(4) f() f() f(). Dyamis pgammeig : Istedef gjetatte eusive all til f() med samme, a esultatet av f() lages f seee bu: it ib(it ) { it[] a= ew it[]; a[]=; a[]=; etu fib(, a); it fib(it, it[] a) { if (a[] > ) { etu a[]; { it z= fib( ) fib( ); a[]= z; etu z; f(4) f() f() f() f() i- : H-99 4. Reusj:
Reusj & effetivitet i alle pemutasje av [,,...-] (f et patall ) /* pem(a,) { it l= A.legth-; * if (==l) { siv A; * { * f hve id:...l * pem(a,); * bytt A[] g A[id] * pem(a,); * te[...l]; A[..-] A[] A[..l] pem(a,) sive alle pem /* PE(A) { it l= A.legth-; * f hve :...l/ { * bytt A[] g A[]; * pem(a,); * bytt A[] g A[]; siv iv(a);. Avsjæig...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, i- : H-99 4. Reusj: Kmplesitet av e eusiv fusj atall de i eusjsteet avhege av stø på steget mt basis i hvet eusivt all (høyde av teet) atall eusive all i hvet steg ( bedde av fgeige) abeidsmegde ved sammesettig av esultate fa eusive all () =, () = () = () () O( ) h= () =, () = () = () () O(.6 ) 4 h= () =, () = () = () () () O( ) / * = O() 4 h= () =, () = () = () * O() h= MS() = lg() = -=O() MS() = MS(/) MS(/) h= =lg() (/) (/4) (/8) i- : H-99 4. Reusj:
5. Reusj... it ib(it ) { if (== ==) etu ; etu ib(-) ib(-); f() f(4) f() 4 implemetees med Stabel f() f() f() f() f() f() 5 b 5 i- : H-99 4. Reusj: Reusj til iteasj (a alltid mgjøes v.hj.a. Stabel) it fibs(it a) { Stig ; it, a, a; Stac p = ew StacImp(); Stac e = ew StacImp(); it ib(it ) { if (== ==) etu ; etu ib(-) ib(-); Ne eusj (f.es. hale-eusj) a mgjøes til iteasj på e elee måte. Stac a = ew StacImp(); p.push( ); a.push( ew Itege(a) ); while (!p.empty()) { = (Stig) p.pp(); if (.equals( ) ) { = ( (Itege)a.pp() ).itvalue(); if (== ==) e.push( ew Itege() ); { p.push( ); p.push( ); p.push( ); a.push( ew Itege(-) ); a.push( ew Itege(-) ); if (.equals( ) ) { a= ( (Itege)e.pp() ).itvalue(); a= ( (Itege)e.pp() ).itvalue(); e.push( ew Itege(aa) ); etu ( (Itege)e.pp() ).itvalue(); i- : H-99 4. Reusj: 4
6. Kethet Gitt e istas av et pblem P :. hva gjø jeg å e basis tilfelle. hvda stuee løsig f utfa løsige f e mi P() if Basis() etu??? etu Kmbie(P(m)... P(m)) Temieig: P() if Basis() stppe eusj væ sie at hve mi, e æmee Basis mbiasj ppetthlde eusjs-ivaiat Kethet: P() if Basis() tlle at det utføes itig hadlig HVIS hvet eusivt all P(mi) etuee itig esultat!!! DETTE ANTAR VI!!! SÅ gi Kmbie(P(m)... P(m)) itig esultat i- : H-99 4. Reusj: 5 Kethet: eusjs-ivaiat /* it[] MS(it[] A) { it = A.legth; * if ( == ) { etu A; * { * del A i midte i : * t= A[.../] g t = A[/...]; * ste eusivt (mide) delee * = MS(t) g * = MS(t) * etu flettet esultat av * eusive all (,) Ivaiat: MS(A) etuee stet agumet A: if lgh== da e A stet dele A i t disjute dele t= A[.../] g t= A[/...] = MS(t) etuee stet t = MS(t) etuee stet t hvis flette et t stete aay, så etuee hele -gee stet A /* it BS(it[] A, it x, it l, it h) { * it m= (lh) / ; * if (l > h) etu ; * if (A[m] == x) etu m; * if (A[m] x) etu BS(A, x, m, h); * etu BS(A, x, l, m ); Ivaiat: agumetet A e stet & e x i A, så e de mellm [l... h] (iitielt all med (A, x,, A.legth-) if l > h x a ie væe de ( e itig) if A[m] = x da ha vi fuet de (m e itig) if A[m] x e x i A, så må de væe mellm [m... h] BS(A, x, m, h) vil etuee itig esultat A[m] > x e x i A, så må de væe mellm [l... m ] BS(A, x, l, m ) vil etuee itig esultat i- : H-99 4. Reusj: 6
øe-ivaiat it sum(it ) { if ( == ) etu ; basis gi itig sum() = etu sum( ); hvis sum( ) gi itig = i så e sum() = sum( ) = i = = i i it sumw(it ) { it i=, =; while (i!= ) { = i; i; // = i, i =i.. a. b. øe-ivaiat, I: = Iitialiseig: i= & = = hvis I: = i = så hlde I : = = i = i = => I hlde fø ppe i' = ette ppe it sumw(it ) { it i=, =; while (i!= ) { i; = i; // i = i, = i etu ; 4. i Utgag: I: = & i = => = = = etu ; i- : H-99 4. Reusj: 7 øe-ivaait: esempel. /** beege heltalls vsiet samt este @paam x >= @paam y > @etu (q, ) sa. x= q*y & = y & = q div(it x, it y) { it q = ; it = x ; iitialiseig: q = & = x >= x= q*y & = & = q while (y = ) { I: = & x = q*y & = q ata at de gjelde ved igag, samt y = q = q ; = y; da gjelde, ette løeppe: q = q & = q = q & = y & = & y = = q *y = (q)*y ( y) = q*y y y = q*y = x dvs. I ppetthldes gjem ppe utgag fa løe: I & y x = q*y & = y & = q etu (q, ) ; i- : H-99 4. Reusj: 8
øe-ivaiat: esempel. /** beege støste felles divis @paam x > @paam x > @etu y = gcd(x,x) gcd(x,x) { y= x; y= x; iitialiseig: x = y & x = y gcd(x,x) == gcd(x,x) while (y!= ) { if (y y) (y,y) = (y,y); I: gcd(y,y) = gcd(x,x) ata at de gjelde he gcd(x,x) = gcd(y,y) = gcd(y,y) = gcd(y,y ) // (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) utgag: I & y = gcd(x,x) = gcd(y,y) = gcd(,y) = y Hvis gcd(y,y) = z >= & y >= y, så *) y = z* = z* = y & gcd(,) = Me da: y = y y = z*( ) & gcd(, ) = hvis ie, dvs. gcd(, ) = v >, da = v*a & = v*b, så = v*bv*a = v*(ba) dvs. da gså gcd(,) = v > mtsie *) i- : H-99 4. Reusj: 9 Oppsummeig. Reusj Splitt g hes bestem hva sm må gjøes i basis tilfelle() stue ( hes ) e løsig fa (eusive) løsige f ( splitt ) e mide istase. Ehve idutiv datatype (at, it, liste, tæ,...) gi phav til eusive algitme. Reusj vs. iteasj (eusj implemetees iteativt med bu av stabel) 4. Kmplesistet av eusiv fusj avhege av atall de i eusjste ( splitt ) dybde (høyde) av teet hv stt steg mt basis utgjø hve splittig atall eusive all (bedde av teet) på hvet ivå abeidsmegde f å stuee e løsig utfa løsige f mide istase ( hes ) 5. Kethet bestem eusjs-ivaiate veifise at basistilfelle() etablee ivaiate ude ata at eusive all etablee ivaiate, vis at stusje vil ppetthlde de bestem løe-ivaiat vis at de gjelde ette iitialiseig (lie fø igage i løe) ude ata at de gjelde fø løeppe, vis at de gjelde ette i- : H-99 4. Reusj: