1 Lærigsmål og pesum TDT4105 Iformsjostekologi grukurs: Uke 44 Aoyme fuksjoer, fuksjosfuksjoer og rekursjo Lærigsmål Aoyme og rekursive fuksjoer Fuksjoer som i-rgumeter Subfuksjoer Pesum Mtlb, Chpter 10 uttt 10. og 10.4 Asbjør Thomsse, IDI 4 Oversikt Fuksjoer hittil (1) Fuksjoer hittil Pekere til fuksjoer (hdles), oyme fuksjoer og fuksjos-fuksjoer Rekursive fuksjoer Likt ethvert et uttrykk (expressio) hr e fuksjo e verdi bsert på i-rgumetee gjeom fuksjoskll: = sqrt(4) K derfor også h fuksjoskll som i-rgumeter rot1 = sqrt(bs(miverdi)) Fuksjoer k også returere flere verdier som vi k brukes gjeom e multippel tilordig: [u, x, y] = svd () Multippel tilordig tillter ku vrible og ideksuttrykk, dvs k h [u, s(), v(,4)] = svd ()
5 6 Fuksjoer hittil () Fuksjoer k h i-rgumeter: sqrt(), zeros(,m), rd Fuksjoer hr et loklt skop, dvs lle vrible er lokle for fuksjoe og ikke tilgjegelig utefor (eget workspce) Fuksjosdefiisjo hr form (hode og kropp): fuctio ret-vr = v (rg-liste) kropp eller ved multippel ut-rgumeter: fuctio [ret-liste] = v (rg-liste) kropp Hode Oversikt Fuksjoer hittil Pekere til fuksjoer (hdles), oyme fuksjoer og fuksjos-fuksjoer Rekursive fuksjoer 7 Pekere til fuksjoer (hdle) Nyttig å gi i fuksjoer til dre fuksjoer som rgumeter (prmetre) Se eksempel seere. Nv på fuksjo som eksisterer vribelv = @fuksjosv; 8 Pekere til oyme fuksjoer Nyttig for å defiere små ikke-vgitte fuksjoer eller for å pkke i kll til dre fuksjoer vr = @(rg1,rg,...)%kode fuksjo i her; >> v = @si; >> v(pi/4) s = 0.70711 >>vf = @rd; >> vf vf = @rd >> vf() s = 0.58167 v er vribel som blir tilordet e peker til fuksjoe. Bre v oppgis her og ikke prmeterliste. Fuksjoe klles ved å skrive vribelv(%prmetre) NB! Må h pretes i kllet også år fuksjoe ikke hr oe rgumeter. Får ellers bre vribelverdie, dvs fuksjospekere, og ikke utført fuksjoe. Ikke bld smme med tbeller og idekser >> f = @(x) si(x)/x; >> g = @(x,y) x^ + y^; >> f(1) s = 0.84147 >> f() s = 0.047040 >> g(,) s = 1 Bre prmeterliste oppgis etter @ etterfulgt v fuksjosuttrykk. Fuksjoe hr ltså ikke v (oym). NB! Vribler som ikke er i prmeterlist rves fr rbeidsområdet (workspce) der fuksjoe er klt
9 Eksempel pekere til fuksjoer 10 fleksiplot.m Skriv e Mtlb-fuksjo som fier ut om e grf f(x) er like i et pukt, dvs f(x)*f(-x) >= 0 Fuksjos-fuksjoer fuctio iseve = eve(f,x) iseve = f(x)*f(-x) >= 0; Tr e fuksjo som i-rgumet til e e fuksjo ved å bruke fuksjospeker (hdle) Øsker f.eks å plotte cos ved å skrive: fleksiplot(@cos) Hvord ser fuksjoe fleksiplot ut? >> f = @(x) si(x)/x; >> eve(f, pi/) s = 1 >> p = @(u) u^; >> eve(p, 1) s = 0 Vribele f er et vlig rgumet som peker til e fuksjo som skl brukes i eve(). f hr selv et rgumet x som også må få e verdi i eve(). fuctio fleksiplot(fp) % Eksempel på e fuksjosfuksjo. % Pekere til fuksjoe overføres som i-rgumet % i vrible fp og fuksjoe plottes x = 1:.5:6; y = fp(x); plot(x,y,'ko') 11 1 Noe yttige fuksjosfuksjoer Oversikt fplot tilbyr D fuksjosplott direkte ved: fplot(fp, [xmi xmx]) % fst form på kll strfuc koverterer fr strig til fuksjospeker fp = strfuc( si ); fucstr koverterer fr fuksjospeker til strig Fuksjoer hittil Pekere til fuksjoer (hdles), oyme fuksjoer og fuksjos-fuksjoer Rekursive fuksjoer evl utfører fuksjoe som tekststreg (som før) fstr = strfuc(@cos); y = evl(strct(fstr, (x) )); fevl utfører fuksjoe direkte ved å bruke fuksjospeker og rgumeter fevl(@si,.)
1 14 Rekursive fuksjoer Fuksjoer som kller seg selv Hvert fuksjoskll oppretter et ytt workspce Må være et termierigsltertiv, dvs. fuksjoe utfører setiger og returerer ute å gjøre kll til seg selv (bse cse) Itersjo k lltid uttrykkes som rekursjo me ieffektivt! Eksempel:! Er defiert som! = 1 * * *...* Altertiv rekursiv defiisjo:! = * (! 1)! geerl cse 1! = 1 bse cse (vslutig/termierig) Eksempel! = *!! = * 1! 1! = 1 = =6 15 Eksempel:! som rekursiv fuksjo 16 Hv skjer uder kjørig? (1) Bse workspce (hovedrbeidsområdet) Ige vribler eå fuctio = fct () if ( > 1) = * fct (-1); = 1; del er termierigstlertiv (bse cse) Progrm Couter (progrmteller): viser hv som er este setig som skl utføres
17 Hv skjer uder kjørig? () Vi k se på som vet på e "låst vribel som ieholder verdie, dvs er e kostt. 18. fuctio = fct () if ( > 1) = * fct (-1); = 1; Hv skjer uder kjørig? () Nytt workspce med lokle vrible for fc() Overførig v irgumet (cll-by-vlue) 19. fuctio = fct () if ( > 1) = * fct (-1); = 1; Hv skjer uder kjørig? (4) 0. fuctio = fct () if ( > 1) = * fct (-1); = 1; Hv skjer uder kjørig? (5)
1. fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); = 1; Hv skjer uder kjørig? (6) Nytt workspce med lokle vrible for fc(). fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); = 1; Hv skjer uder kjørig? (7) Overførig v irgumet (cll-by-vlue). fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); = 1; Hv skjer uder kjørig? (8) 4. Hv skjer uder kjørig? (9) fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); fuctio = 1; = fct () if ( > 1) = * fct (-1); = 1; 1 1 Nytt workspce med lokle vrible for fc(1)
5. Hv skjer uder kjørig? (10) fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); fuctio = 1; = fct () if ( > 1) = * fct (-1); = 1; 1 1 6. Hv skjer uder kjørig? (11) fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); fuctio = 1; = fct () if ( > 1) = * fct (-1); = 1; 1 1 7. Hv skjer uder kjørig? (1) fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); fuctio = 1; = fct () if ( > 1) = * fct (-1); = 1; 1 1 8. fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; 1 = * fct (-1); = 1; Hv skjer uder kjørig? (1) fct(1) returer med verdi 1.
9. fuctio = fct () if ( > 1) = * fct (-1); fuctio = fct () if ( > 1) = 1; = * fct (-1); = 1; Hv skjer uder kjørig? (14) 0. Hv skjer uder kjørig? (15) fuctio = fct () if ( > 1) = * fct (-1); = 1; fct() returer med verdi. 1. fuctio = fct () if ( > 1) = * fct (-1); = 1; Hv skjer uder kjørig? (16) 6 6 Hv skjer uder kjørig? (17) fct() returer med verdi 6. Vi er tilbke i hovedprogrmmet! og er ferdig med skriptet 6 E ieffektiv måte å rege ut!
Klltre for fct() 4 Oppgve power.m fct() E rekursiv defiisjo v er: fct() fct(1) fct(0) = 1 hvis == 0 = *!1 hvis > 0 Lg e fuksjo som bereger. Du skl ikke bruke ^ opertore oe sted! 5 6 Hv gjør mystery? Subfuksjoer fuctio outvr = mystery(x,y) if y == 1 outvr = x; outvr = x + mystery(x,y!1); K deklrere mer e e fuksjo i e m-fil Uder de primære fuksjoe (første i file) subfuksjoer, lokle fuksjoer eller hjelpefuksjoer Usylige og utilgjegelige utefor m-file Klles fr primærfuksjoe som dre fuksjoer K bidr til å dele opp progrmkode Se y progrmkode for fleksibel ilesig v felter for billetter i Tetersl på este foiler (se også tidligere kode) mtchfelter er subfuksjo og ikke tilgjegelig utefor lesfelterm
7 Progrmeksempel Tetersl Lg ekel versjo for reserverig v plss (skript) - 1 pseudokode dtstruktur Utvid skriptet til å hådter pris, tll billetter og slgsitekt -1b Lg ege fuksjo for prisberegig 1-c Lg ege fuksjoer for å lese i lovlig stolr. og skrive ut bildet v reserverte seter i sle (mtrise) 1d Utvid progrmmet til å lgre perso, rbtt etc. for hvert sete 1e K seere utvides til å tolke fleksible kommdoer for å legge dt i i feltee 8 Mier om strukturfuksjoer! (fr uke 4) rmfield returer e y struktur med oppgitt felt fjeret De gmle er uret isstruct returer true hvis ivribele er e struktur isfield returer true hvis feltet er e del v strukture fieldmes returer et cell rry med feltvee isempty returerer true hvis feltet er tomt (brukes også på cell rry) 9 Tetersl: les i feltverdier lesfelterm.m 40 lesfelterm.m
41 Tips Husk å overføre pekere til e fuksjo, og ikke fuksjosv, år du bruker fuksjosfuksjoer Pss på t du lltid hr et vslutigsltertiv i e rekursiv fuksjo (bse cse) Bruk oyme fuksjoer år fuksjoskroppe bre består v et ekelt uttrykk. Når mulig, bruk itersjo istedet for rekursjo