Noter. Indhold. Oktober 2009

Størrelse: px
Starte visningen fra side:

Download "Noter. Indhold. Oktober 2009"

Transkript

1 Noter Oktober 2009 Dette er en samling af noter skrevet til kurset Programmering 2 som supplement til den anvendte lærebog. Java-kildeteksten for de anvendte programeksempler kan nås via WWW: Indhold 1 Klassedesign og invarianter Implementationsinvariant for en kasse Visuel løkkeinvariant ved søgning Visuel løkkeinvariant ved primtalsfaktorisering Rekursive metoder Rekursiv funktion: Fibonacci tal Rekursiv grafik: Fraktaler Gensidig rekursion: Evaluering af udtryk Randomisering og rekursion Generelt om rekursion Rekursive datastrukturer Rekursive træer Visitor Rekursiv liste Sammenligning af gennemløbsteknikker Algoritmer over reelle tal Flydende komma aritmetik Reel aritmetik i Java Reelle algoritmer

2 1 Klassedesign og invarianter Dette kapitel er et supplement til kapitel 3, Guidelines for Class Design i Horstmanns bog Object oriented Design & Patterns. Vi viser eksempel på brug af en speciel form for kontrakter nemlig implementations- og løkkeinvarianter ved implementation af hele klasser og enkelte metoder. En implementationsinvariant kan simplificere implementationen af en klasse og dermed gøre det lettere at indse at den er implementeret korrekt, ligesom en løkkeinvariant kan gøre det lettere at sikre rigtig start og slut af sweep og iterationer. Vi vil kun anvende løkkeinvarianter i en forenklet udgave, som vi kalder visuelle løkkeinvarianter. En sådan illustreres med en figur fremfor i matematisk notation. I kurset Algoritmer og datastrukturer 1 gives en mere grundig introduktion til brugen af invarianter. 1.1 Implementationsinvariant for en kasse Vi ønsker at modellere en papkasse repræsenteret ved de tre sidelængder z y x På papkasser kan man oplagt definere en ordning, således at k 1 k 2,hvisk 1 kan være inde i k 2 idet vi kræver, at siderne holdes parallelle. Vi ser bort fra væggenes tykkelse, så en papkasse kan f.eks. være inde i sig selv. Den offentlige interface skal tilbyde følgende operationer: En konstruktør der givet tre tal laver en kasse med de angivne dimensioner en metode der beregner rumfanget af kassen en metode der beregner om kassen kan være inde i en anden givet kasse 2

3 en metode der beregner den mindste kasse, som både kassen selv og en anden kasse kan være inden i. Dvs. klassen skal have følgende form public class Box { public Box(int w, int h, int d) {... public int volume() {... public boolean fitsin(box b) {... public Box combine(box b) {... Når vi overvejer, hvorledes f.eks. fitsin skal skrives, så ser vi hurtigt en komplikation. Vi er ikke interesseret i papkasser, der står på skrå, men alligevel kan en papkasse vendes på 6 essentielt forskellige måder, så det ser ud som om, vi bliver nødt til at undersøge en hel del tilfælde. Det kan vi dog undgå hvis vi påtvinger klassen Box en implementationsinvariant som instans variablerne skal overholde: /** * IMPLEMENTATION INVARIANT: x <= y <= z */ private int x,y,z; Implementationsinvarianten kan ses som en kontrakt mellem implementørerne af konstruktøren og de forskellige metoder, idet Inden udførelsen af en public metode kan man gå ud fra at invarianten er overholdt. Inden afslutning af konstruktøren eller en af de offentlige metoder skal det sikres at invarianten er overholdt Bemærk også at de tre instansvariabler har visibility modifier private og derfor kun kan ændres af kode inde i klassen. Det er derfor let at se at invarianten altid vil blive overholdt, uanset hvordan klassen benyttes. Vi kommer til følgende implementation public class Box { /** 3

4 * IMPLEMENTATION INVARIANT: x <= y <= z */ private int x,y,z; public Box(int w, int h, int d) { x = w; y = h; z = d; while (x>y y>z) { if (x>y) {int temp = x; x = y; y = temp; if (y>z) {int temp = y; y = z; z = temp; public int volume() { return (x*y*z); public boolean fitsin(box b) { return ( x<=b.x && y<=b.y && z<=b.z ); public Box combine(box b) { return new Box(Math.max(x,b.x), Math.max(y,b.y), Math.max(z,b.z)); I metoderne fitsin og combine udnytter vi, at invarianten gælder. I konstruktøren sorterer vi x, y og z, således at invarianten bliver etableret. Hvis vi ikke opretholdt invarianten, så blev vi nødt til at tage stilling til alle de 6 forskellige måder, man kan orientere en papkasse på. F.eks. ville metoden fitsin blive til public boolean fitsin(box b) { return ( (x<=b.x && y<=b.y && z<=b.z) (x<=b.x && z<=b.y && y<=b.z) (y<=b.x && x<=b.y && z<=b.z) (y<=b.x && z<=b.y && x<=b.z) (z<=b.x && x<=b.y && y<=b.z) (z<=b.x && y<=b.y && x<=b.z) ); 4

5 og operationen combine kunne blive helt uoverskuelig. 1.2 Visuel løkkeinvariant ved søgning Det første eksempel på anvendelse af en løkkeinvariant er en simpel lineær søgning. Der skal implementeres en metode, som givet et array og et tal returnerer tallets position i arrayet, hvis det findes i arrayet og ellers returnerer -1. Metodens signatur er således public int linearsearch(int[] a, int e) {... Implementationen klares let ved et enkelt sweep gennem arrayet. Et typisk øjebliksbillede under dette sweep er følgende: e ikke her 0 i a.length-1 Vi kan samtidig opfatte tegningen som en kontrakt (den visuelle løkkeinvariant) der skal overholdes af den der implementerer metoden, dvs. tegningen kan antages at være korrekt før hvert iterationsskridt det skal sikres at tegningen stadig er korrekt efter hvert skridt, og efter initialiseringen af løkkevariablen i. På baggrund af tegningen er det let at skrive sweep-løkken, så løkkevariablen i initialeres rigtigt og vi anvender det rigtige stopkriterium. Ved start af sweep er det skraverede område tomt og i skal initialiseres til 0. Undervejs må vi kun tælle i op, når det første element i det hvide område ikke er i- dentisk med det element, vi leder efter. Hvis det første element i det hvide område skulle vise sig at være det element, vi leder efter kan søgning umiddelbart standses. Eneste anden grund til at standse er at det hvide område bliver tomt, dvs. søgningen fortsætter så længe i<a.length: public int linearsearch(int[] a, int e) { int i=0; while (i<a.length) { if (a[i]==e) return i; else i++; return -1; 5

6 Hvis man søger i en sorteret liste er binær søgning et effektivt alternativ til lineær søgning. Antag at vi leder efter Johansen i telebogen. Hvis vi slår op ca. midt i telefonbogen og finder en side med Mikkelsen kan vi eliminere den halvdel af telefonbogen der følger efter Mikkelsen fra den videre søgning. Hvis vi dernæst slår op ca. midt i den tilbageværende halvdel af bogen og finder en side med Hedegård kan vi tilsvarende eliminere den del af bogen der kommer før Hedegård. På denne vis fortsætter vi med at slå op ca. midt i den tilbageværende del af telefonbogen indtil vi enten har fundet en side med Johansen eller vi har elimeneret hele bogen og må konkludere at Johansen ikke forekommer. Hvis denne strategi anvendes på søgning i et sorteret heltalsarray kan et typisk øjebliksbillede se ud som følgende: 0 e ikke her e ikke her low high a.length-1 Som for lineær søgning er det forholdsvis let at implementere metoden, når man hele tiden har tanke for at overholde den visuelle løkkeinvariant. public int binarysearch(int[] a, int e) { int low = 0; int high = a.length-1; while (low<=high) { int mid = (low+high)/2; if (a[mid]==e) return mid; else if (a[mid]<e) low = mid+1; else high = mid-1; return -1; For en fornuftig søgning er det væsentlig at det hvide ikke-undersøgte område på tegningen mindskes (så meget som muligt) i hvert skridt. Ved lineær søgning, der består af et enkelt sweep, sikres det ved at tælle løkkevariablen een frem i hvert skridt. Ved binær søgning er progressionen mindre gennemskuelig. Hvis man er uforsigtig kan man lave en implementation, hvor det hvide område i nogle tilfælde ikke mindskes, og dermed får vi en evig løkke, f.eks.: public int loopingbinarysearch(int[] a, int e) { int low = 0; 6

7 int high = a.length-1; while (low<=high) { int mid = (low+high)/2; if (a[mid]==e) return mid; else if (a[mid]<e) low = mid; else high = mid; return -1; Java stiller en polymorf binær søgning til rådighed for brugeren i metoden Collections.binarySearch. 1.3 Visuel løkkeinvariant ved primtalsfaktorisering Først betragtes problemet at afgøre om et tal er et primtal. Primtallene er 2, 3, 5, 7, 11, 13,..., og der gælder at n 2 er et primtal hvis og kun hvis n ikke har en divisor d {2, 3,...,n 1. For at afgøre om n er et primtal, kan man lave et sweep over de mulige divisorer, og for hver divisor checke om den faktisk dividerer n. Vi anvender en løkkevariabel i til at angive hvor langt vi er kommet med sweepet, og som tidligere kan vi tegne et øjebliksbillede no divisors i 1 i... n 1 Baseret herpå kommer man let frem til følgende metode med precondition n 2. public boolean isprime(int n) { int i = 2; while (i<n) { if (n%i==0) return false; else i++; return true; 7

8 Næstefter løses det udvidede problem, hvor man finder den fuldstændige primfaktorisering af n. F.eks ønsker vi at metodekaldet factor(75) returnerer teksten "3*5*5". Man kan søge gennem de mulige divisorer d {2, 3,...,n 1 ved et sweep. Vi ønsker at en divisor der forekommer med multiplicitet > 1 skrives et tilsvarende antal gange. Tages et øjebliksbillede under sweepet, vil vi have udskrevet nogle faktorer, og der vil restere r, den ufaktoriserede del af n. Hvis r kan faktoriseres yderligere, vil den have en divisor d r. Denne indsigt leder til følgende visuelle invariant no divisor of r i 1 i... r Herudfra implementeres en metode, der som precondition har n 2: public String factor(int n) { int r = n; int i = 2; String s = ""; while (i*i<=r) { if (r%i == 0) { s = s + i + "*"; r = r/i; else i++; return s + r; Den angivne metode vil aldrig lede efter divisorer der er større end n. En tilsvarende optimering kan foretages på implementationen af isprime. Med eller uden denne optimering er begge algoritmer alt for langsomme til praktisk brug ved faktorisering (primalitetstest) af tal med f.eks. tredive eller flere cifre. Java tilbyder en randomiseret primalitetstest i metoden BigInteger.isProbablePrime, der er hurtig for mangecifrede tal, men til gengæld kan returnere et fejlagtigt svar. Den eneste kendte effektive (randomiserede) algoritme til at finde primtalsfaktoriseringen af mangecifrede tal 8

9 forudsætter adgang til en kvantecomputer af en størrelse, som det endnu ikke er lykkedes at konstruere. 9

10 2 Rekursive metoder En rekursiv metode indeholder kald af sig selv. Dette begreb er ikke så fremmed, som det måske synes ved første øjekast. Et velkendt eksempel på en rekursivt defineret udregningsmetode udgøres af de sædvanlige regler for differentiation af rationale funktioner (det vil sige funktioner som er summer, produkter eller kvotienter mellem polynomier). Reglerne er som følger; f(x) og g(x) er rationale funktioner og c er en reel konstant 1) c =0 2) (x n ) = nx n 1 3) (cf(x)) = cf (x) 4) (f(x)+g(x)) = f (x)+g (x) 5) (f(x)g(x)) = f(x)g (x)+f (x)g(x) ( ) f(x) 6) = g(x)f (x) f(x)g (x) g(x) g 2 (x) Reglerne 1) og 2) angiver direkte resultatet af at differentiere simple udtryk, mens reglerne 3) 6) angiver, at et sammensat udtryk differentieres ved, at det opbrydes i deludtryk, som hver især differentieres ved (rekursiv) anvendelse af reglerne. I det følgende vises et antal eksempler på rekursive metoder. 2.1 Rekursiv funktion: Fibonacci tal Fibonacci tallene er opkaldt efter matematikeren Leonardo Fibonacci af Pisa, som i 1202 udgav værket Liber Abaci (bogen om beregninger), hvori han blandt andet stillede spørgsmålet Hvor mange kaninpar kan der blive af et nyfødt kaninpar på et år, hvis hvert par føder et nyt par hver måned og et nyfødt par føder første gang efter to måneder? Hvis det antages, at kaniner aldrig dør, er det ikke svært at se, at der spørges efter det 12. element i følgen {F n n 0 defineret ved { 1 n =0, 1, F n = F n 1 + F n 2 n>1. 10

11 Denne definition er rekursiv, da formlen for det n te Fibonacci-tal henviser til mængden af (mindre) Fibonacci-tal. Vi kan skrive en tilsvarende simpel funktion, der udregner det n te element public long fib(int n) { if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2); Et kald af fib(4) vil give anledning til følgende træstruktur af procedurekald fib(3) fib(2) fib(1) fib(1) fib(0) fib(4) fib(2) fib(1) fib(0) 2.2 Rekursiv grafik: Fraktaler En fraktal er en kurve, som intetsteds er glat nok til at kunne approximeres med linjestykker. Et simpelt eksempel på en fraktal er den såkaldte Kochkurve, der opstår som grænseværdien (for n gående mod uendelig) af Kochlinjen af orden n. En Koch-linje af orden n opnås ud fra en Koch-linje af orden n 1 ved at give alle linjestykker i den et trekantet hak. De følgende er Koch-linjer af orden 1, 2 og 4 11

12 Vi kan skrive en meget simpel rekursiv procedure, der tegner en Koch-linje af en given orden. Vi anvender et Crayon objekt c, hvor metoden turn ændrer blyantens tegneretning med et specificeret antal grader og metoden move trækker blyanten den specificerede længde i den aktuelle tegneretning så et linjestykke tegnes. private void kochline(int order, double len) { if (order == 0) c.move(len); else if (order > 0) { kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); c.turn(120); kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); Bemærk, at vi foretager 4 rekursive kald, og at vi her har et eksempel på en rekursiv procedure, hvor en ikke-rekursiv formulering forekommer at være endog meget besværlig. Følgende program tegner en snefnug-lignende figur bestående af tre Kochlinjer (kildekoden til Crayon-klassen er udeladt men kan findes i eksempelkataloget). import java.awt.*; public class KochLineTest { private static Crayon c; private static void kochline(int order, double len) {... 12

13 public static void main(string[] args) { c = new Crayon(Color.red,1); c.jumpto(50,150); kochline(4,300); c.turn(120); kochline(4,300); c.turn(120); kochline(4,300); c.turn(120); 2.3 Gensidig rekursion: Evaluering af udtryk Det er tilladt at definere to metoder som gensidigt rekursive, f.eks.: public void ned(int n) { while(n%2==0) n = n/2; op(n); public void op(int n) { 13

14 if (n>1) { n = 3*n+1; ned(n); Det er ukendt om kald af metoden ned standser for alle input (aktuelle parametre)! Som et simpelt men realistisk eksempel på gensidig rekursion vil vi betragte evaluering af simple aritmetiske udtryk. F.eks. følgende (3 + 4) 5 (1 (2 (3 (4 5)))) Udregningen af et udtryk kompliceres af at * og / binder tættere end + og - ligesom man kan gruppere deludtryk med parenteser. Men dette indfanges af de følgende syntax diagrammer, som samtidig afgrænser præcis hvilke udtryk vi ønsker at kunne evaluere: <expression> <term> + - <term> <factor> * / <factor> ( <expression> ) <number> Ved at anvende syntaxdiagrammerne vil man se at <expression> kan danne <term>+<term>, hvor denførste<term> via <factor> genererer tallet 3,mens 14

15 den anden <term> først danner <factor>*<factor> og derefter danner de to <factor> henholdsvis tallene 4 og 5. Denne derivation af tekststrengen 3+4*5 kan opskrives i et syntaxtræ. <expression> <term> <term> <factor> <factor> <factor> <number> <number> <number> * 5 Det er her tillige gjort for (3+4)*5. <expression> <term> <factor> <factor> <expression> <number> <term> <term> <factor> <number> <factor> <number> ( ) * 5 På baggrund af syntaxdiagrammerne er der naturligt at skrive 3 gensidigt rekursive metoder getexpressionvalue, gettermvalue, getfactorvalue, der kan beregne værdien af henholdsvis et udtryk, en term og en faktor. 15

16 Da hele udtrykket bliver leveret som en tekst er det praktisk at have en hjælpeklasse ExpressionTokenizer til at levere leksikalske symboler et ad gangen, hvor et leksikalsk symbol er en tekst bestående af cifre, eller en af "+", -", "*", "/", "(", ")". EnExpressionTokenizer har to metoder nexttoken() og peektoken(), som begge returnerer det næste leksikalske symbol. Forskellen mellem de to metoder er at nexttoken() er en mutator der skifter ExpressionTokenizer objektets tilstand et (leksikalsk) symbol frem, mens peektoken() efterlader objektets tilstand uændret. Detaljerne i implementationen af klassen kan findes i eksempelkataloget. De 3 gensidigt rekursive metoder defineres i klassen Evaluator: public class Evaluator { public Evaluator(String anexpression) { tokenizer = new ExpressionTokenizer(anExpression); public int getexpressionvalue() {... public int gettermvalue() {... public int getfactorvalue() {... private ExpressionTokenizer tokenizer; Metoden til beregning af et udtryk indeholder i overensstemmelse med syntaxdigrammet et ubetinget kald af metoden til beregning af termer public int getexpressionvalue() { int value = gettermvalue(); while ("+".equals(tokenizer.peektoken()) "-".equals(tokenizer.peektoken())) { String operator = tokenizer.nexttoken(); int value2 = gettermvalue(); if ("+".equals(operator)) value = value + value2; else value = value - value2; return value; 16

17 Metoden til beregning af en term indeholder i overensstemmelse med syntaxdigrammet et ubetinget kald af metoden til beregning af faktorer public int gettermvalue() { int value = getfactorvalue(); while ("*".equals(tokenizer.peektoken()) "/".equals(tokenizer.peektoken())) { String operator = tokenizer.nexttoken(); int value2 = getfactorvalue(); if ("*".equals(operator)) value = value * value2; else value = value / value2; return value; Metoden til beregning af en faktor har en rekursionsbetingelse der sikrer at et rekursivt kald af metoden til beregning af udtryk kun foretages under visse betingelser, så der er mulighed for at rekursionen kan stoppe public int getfactorvalue() { int value; if ("(".equals(tokenizer.peektoken())) { tokenizer.nexttoken(); value = getexpressionvalue(); tokenizer.nexttoken(); // read ")" else value = Integer.parseInt(tokenizer.nextToken()); return value; 2.4 Randomisering og rekursion Her er nogle eksempler på træer (blomster) der er genereret ved en simpel rekursiv teknik kombineret med randomisering. 17

18 Ved genereringen af et træ opfattes det enten som bestående af en stamme med flere mindre træer (grene) på toppen, eller blot som værende et enkelt blad. 18

19 3 mindre træer (grene) = Træ stamme De foranstående figurer er genereret ved at lade et træ bestå af en stamme med 6 grene (deltræer). Vinklen mellem grenene er 13 grader, og et deltræ tegnes ikke nødvendigvis. Faktisk er sandsynligheden for at et deltræ tegnes kun 40%. På figurerne er den første stamme tegnet med bredde 6 og bredden aftager derpå en for hvert rekursionsskridt. Når bredden når ned på 0 tegnes et blad i stedet for et træ. Dvs. bladet tegnes ikke nødvendigvis men kun med sandsynlighed 30%. Stammer tegnes i en tilfældig farve, der delvist afhænger af bredden. For at gøre udtegningen relativt simpel anvendes en udgave af Crayon klassen, som tillader ændring af farve og bredde på en farveblyant (metoderne setcolor, setwidth). import java.awt.*; public class TreeTest { private static CCrayon c; /** tree draws a random tree n - order of tree len - length of trunk */ public static void tree(int n, int len) {... /** leaf draws maybe(!) a leaf of a random color len - side length of leaf */ private static void leaf(int len) {... private final static int BRANCH_MAX = 6; private final static int BRANCH_ANGLE = 13; private final static double BRANCH_PROB = 0.4; private final static double LEAF_PROB = 0.3; 19

20 public static void main(string[] args) { c = new CCrayon(); c.jumpto(200,400); c.turn(-90); tree(6,40); Den basale rekursive metode til udtegning af et træ ser således ud: private static void tree(int n, int len) { if (n==0) leaf(len/2); else { int bias = (int) (2*Math.random()); if (n+bias >=6) c.setcolor(color.black); else if (n+bias >=4) c.setcolor(color.gray); else c.setcolor(color.green); c.setwidth(2*n); c.move(len); c.turn((branch_angle*(branch_max-1))/2.0); for (int i = 1 ; i<=branch_max ; i = i+1 ) { if (Math.random()<BRANCH_PROB) tree(n-1, len-2); c.turn(-branch_angle); c.turn((branch_angle*(branch_max+1))/2.0); c.turn(180); c.jump(len); c.turn(-180); //return pen to base of tree Og et blad udtegnes med denne metode private static void leaf(int len) { if (Math.random()<LEAF_PROB) { if (Math.random()<0.5) c.setcolor(color.red); else c.setcolor(color.yellow); c.setwidth(2); c.turn(-branch_angle/2.0); c.move(len); c.turn(branch_angle); c.move(len); c.turn(180-branch_angle); c.move(len); c.turn(branch_angle); c.move(len); c.turn(180-branch_angle/2.0); 20

21 Ved at ændre på konstanterne kan man frembringe træer (planter, blomster) med andre karakteristika. 2.5 Generelt om rekursion Ligesom while-sætninger kan kald af rekursive metoder give sætninger, hvis udførelse aldrig terminerer. Det simpleste eksempel er public void loopingrecursivemethod() { loopingrecursivemethod(); Et kald af metoden loopingrecursivemethod fører til et nyt, rekursivt kald af loopingrecursivemethod, der fører til endnu et rekursivt kald af loopingrecursivemethod og så videre. Hvis enhver instans af en rekursiv metode udfører endnu et rekursivt kald, så vil udførelsen naturligvis aldrig stoppe. Det er derfor vigtigt, at enhver rekursiv metode indeholder en rekursionsbetingelse, der på et tidspunkt tillader proceduren at undgå flere rekursive kald. Hvis man kigger tilbage på de forskellige eksempler i dette afsnit vil man se at de alle indeholder en sådan rekursionsbetingelse. Det gælder også de gensidigt rekursive metoder til beregning af udtryk hvor getfactorvalue kan undgå det rekursive kald af getexpressionvalue, der er styret af rekursionsbetingelsen. En rekursiv løsning kan være betydeligt lettere at forstå (og programmere) end en iterativ løsning. F.eks. vil det være kompliceret (omend bestemt muligt) at lave en iterativ algoritme til at tegne Koch kurver. Til gengæld er en rekursiv løsning i nogle tilfælde meget ineffektiv. F.eks. vil den rekursive Fibonacci metode tage meget længere tid at udføre end en tilsvarende iterativ metode (hvorfor?) public long iterativefib(int n) { if (n <= 1) return 1; long fold = 1; long fold2 = 1; long fnew = 1; for (int i = 2; i <= n; i++) { fnew = fold + fold2; fold2 = fold; fold = fnew; return fnew; 21

22 3 Rekursive datastrukturer I kurset er tidligere introduceret rekursive metoder, dvs. algoritmer, hvis beskrivelse er selvrefererende. Tilsvarende kan man tale om rekursive strukturer. Eksempler: En liste består af et enkelt element efterfulgt af en (kortere) liste eller listen er tom. Et filsystem består af et directory indeholdende en række mindre filsystemer eller filsystemet består af en enkelt fil Ved definitionen af en rekursiv metode er der vigtigt at give metoden mulighed for at standse. Tilsvarende er der for både listen og filsystemet lagt en smutvej ud af rekursionen, listen kan være tom og filsystemet kan bestå af en enkelt fil. 3.1 Rekursive træer Filsystemet er et eksempel på en rekursiv træstruktur, og denne note vil anvende rekursive binære udtrykstræer som gennemgående eksempel. Udtrykket (6+((8 2) 1)) kan opfattes som bestående af en operator "+"og to (mindre) udtryk "6"og "((8 2) 1)". operator deludtryk * Man kan faktiske beskrive alle mulige aritmetiske udtryk (over +, ) rekursivt. Enten består udtrykket af en operator og to deludtryk eller også består udtrykket af et tal alene. En sådan rekursiv struktur repræsenteres naturligt ved et interface og implementerende klasser. For udtrykstræernes vedkommende får man 22

23 public interface Tree { public class Leaf implements Tree { private int value; public Leaf(int n) { value = n; public int getvalue() { return value; public class Node implements Tree { private Operator op; private Tree left; private Tree right; public Node(Tree l, Operator o, Tree r) { op = o; left = l; right = r; public Operator getop() { return op; public Tree getleft() { return left; public Tree getright() { return right; hvor Operator er en Enumerated Type som beskrevet i Horstmann side (2.udgave). public enum Operator { PLUS("+"), MINUS("-"), MULT("*"), DIV("/"); 23

24 private String name; private Operator(String name) { this.name = name; public String tostring() { return name; public int apply(int left, int right) { if (this == Operator.PLUS) return left + right; if (this == Operator.MINUS) return left - right; if (this == Operator.MULT) return left * right; /* this == Operator.DIV */ return left / right; Det tidligere nævnte udtryk kan repræsenteres ved Tree t = new Node( new Leaf(6), Operator.PLUS, new Node(new Node( new Leaf(8),Operator.MULT,new Leaf(2)), Operator.MINUS, new Leaf(1))); Næsten alle former for anvendelse af et udtrykstræ involverer et gennemløb af træet. Hvis værdien af udtrykket skal beregnes, må man nødvendigvis kende alle operatorer og alle tal i hele træet. Denne information kan opsamles ved et gennemløb. Et gennemløb kan ske på flere måder, men et rekursivt postorder gennemløb vil opsamle informationen i en rækkefølge der er belejlig for beregning af udtrykkets værdi. Hvis et udtryk er sammensat, vil et postorder gennemløb først gennemløbe de to deludtryk (rekursivt) og til sidst læse operatoren. 3. Anvend operator * 1 1. Evaluer 2. Evaluer

25 evaluate(v): if v is a leaf: return number stored at v else x = evaluate(left subexpression stored at v) y = evaluate(right subexpression stored at v) return x o y (where o is operator stored at v) I Java kan et sådant rekursivt gennemløb repræsenteres på flere måder. På klassisk vis kan man lave en enkelt rekursiv metode, som svarer ret nøje til pseudokoden. public int evaluate(tree w) { int answer; if ( w instanceof Leaf ) answer = ((Leaf)w).getValue(); else { Tree l = ((Node)w).getLeft(); Tree r = ((Node)w).getRight(); Operator o = ((Node)w).getOp(); int left_answer = evaluate(l); int right_answer = evaluate(r); answer = o.apply(left_answer,right_answer); return answer; Java-koden er omstændelig, specielt fordi det er nødvendigt at teste om et Tree objekt faktisk er et blad eller en indre træknude, og derefter lave casts afhængig af testets udfald. Casts er påtvunget af Java-sproget, men instanceof-testet sikrer at den rekursive metode kan standse fremfor at kalde sig selv i en uendelighed, og dette test kan synes uomgængeligt. Men det er en forkert betragtning. Ved at forlægge evalueringen til metoder i de tre klasser kan man undgå casts og test. Interfacet tilføjes en metode getvalue, som klasserne skal implementere. På denne måde kan metodekaldet evaluate(t) erstattes af kaldet t.getvalue() for t af type Tree. 25

26 public interface Tree { public int getvalue() ; public class Leaf implements Tree {... public int getvalue() { return value; public class Node implements Tree {... public int getvalue() { return op.apply(left.getvalue(),right.getvalue()); Den resulterende javakode er simplere, men der er en ny ulempe. Det har været nødvendigt at ændre de oprindelige tre klasser. Hvis man ønsker at gennemløbe et udtrykstræ med et nyt formål, f.eks. udskrift af udtrykket, så vil det være nødvendigt at tilføje klasserne en metode skræddersyet til netop udskrift, og dermed igen ændre de oprindelige klasser. 3.2 Visitor Visitor designmønstret undgår at føje en ekstra metode til alle klasser i hierarkiet for hver type gennemløb. Metoderne samles i stedet i en ny klasse iføl- 26

27 ge en skabelon der er angivet i et TreeVisitor-interface. Derudover skal der en gang for alle tilføjes en enkelt metode accept til hver klasse i hierarkiet. Disse accept-metoder sørger for at lave call-back til de anvendelsesspecifikke metoder samlet i den TreeVisitor-implementerende klasse. For beregning af et udtryks værdi benyttes følgende struktur: De generelle klasser/interface: public interface TreeVisitor<T> { public T visitleaf(leaf l); public T visitnode(node n); public interface Tree { public <T> T accept(treevisitor<t> v) ; public int getvalue() ; public class Leaf implements Tree { 27

28 ... public <T> T accept(treevisitor<t> v) { return v.visitleaf(this); public class Node implements Tree {... public <T> T accept(treevisitor<t> v) { return v.visitnode(this); Den anvendelsesspecifikke klasse: public class EvaluateVisitor implements TreeVisitor<Integer> { public Integer visitleaf(leaf l) { return l.getvalue(); public Integer visitnode(node n) { int l = n.getleft().accept(this); int r = n.getright().accept(this); return n.getop().apply(l,r); F.eks. kan værdien af udtrykket t udskrives med System.out.println(t.accept(new EvaluateVisitor())). For at lave en anden type gennemløb, er det tilstrækkeligt at lave en ny implementation af TreeVisitor. Som eksempel betragtes udskrift af selve udtrykket. Det foregår naturligt ved et rekursivt in-order gennemløb, dvs. først udskrives venstre deludtryk, dernæst operatoren, og til sidst højre deludtryk. text(v): if v is a leaf: return number else return "(" + text( left subexpression) + operator + text( right subexpression ) 28

29 + ")" ( 6 + ((8 * 2) - 1) ) 2. Print * 1 1. Print 3. Print 8 2 Bemærk at udtrykket ikke udskrives direkte, men den relevante tekst beregnes (uden sideeffekter) og returneres. In-order gennemløbet kan i Java specificeres af følgende klasse public class PrintVisitor implements TreeVisitor<String> { public String visitleaf(leaf l) { return new Integer(l.getValue()).toString(); public String visitnode(node n) { return ("(" + n.getleft().accept(this) + n.getop() + n.getright().accept(this) + ")"); Udtrykket t kan udskrives med sætningen System.out.println(t.accept(new PrintVisitor())). I stedet for at skrive udtrykket som tekst, kunne man ønske at tegne det grafisk som et træ 29

30 y l=(1,1) 2 * 1 c=(2,0) r=(6,1) x Ved et in-order gennemløb kan man tegne træet fra venstre mod højre, således at hvert symbol (operator eller tal), der udskrives, tegnes en enhed længere mod højre end det forrige, samtidigt skal roden i et deludtryk tegnes en enhed længere nede end udtrykkets operator. Hvis stregerne, der repræsenterer grenene udelades kan tallene og operatorerne tegnes korrekt af følgende pseudokode: state : a current drawing position (x,y) initially (x,y) = (0,0) drawsymbol(s): increment x and draw s; draw(v): if v is a leaf: drawsymbol( number ); else increment y; draw( left subexpression ); decrement y; drawsymbol( operator ); increment y; draw( right subexpression ); decrement y; For at tilføje gren-stregerne til tegningen er det nødvendigt at gemme koordinaterne for en linjes første endepunkt indtil positionen af linjens andet endepunkt er kendt (og linjen kan tegnes). I den modificerede pseudokode 30

Noter. Indhold. Oktober 2013

Noter. Indhold. Oktober 2013 Noter Oktober 2013 Dette er en samling af noter skrevet til kurset Programmering 2 som supplement til den anvendte lærebog. Java-kildeteksten for de anvendte programeksempler kan nås via kursuswebsiden

Læs mere

Opgaver. Oktober 2009

Opgaver. Oktober 2009 Opgaver Oktober 2009 Dette er en samling af supplerende opgaver til kurset Programmering 2. I nogle opgaver henvises til filer med Java programmer/klasser. Dette eksempelmateriale kan nås via WWW: http://www.cs.au.dk/dprog2/eksempler/

Læs mere

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer BRP 13.9.2006 Tal. Om computer-repræsentation og -manipulation. Logaritmer 1. Opgaverne til i dag dækker det meste af stoffet 2. Resten af stoffet logaritmer binære træer 3. Øvelse ny programmeringsopgave

Læs mere

Rekursion C#-version

Rekursion C#-version Note til Programmeringsteknologi Akademiuddannn i Informationsteknologi Rekursion C#-version Finn Nordbjerg 1 Rekursion Rekursionsbegrebet bygger på, at man beskriver noget ved "sig selv". Fx. kan tallet

Læs mere

Matematisk modellering og numeriske metoder. Lektion 15

Matematisk modellering og numeriske metoder. Lektion 15 Matematisk modellering og numeriske metoder Lektion 15 Morten Grud Rasmussen 1. november, 2013 1 Numerisk analyse [Bogens afsnit 19.1 side 788] 1.1 Grundlæggende numerik Groft sagt handler numerisk analyse

Læs mere

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte

Læs mere

Eksempel: Skat i år 2000

Eksempel: Skat i år 2000 Kursus 02199: Programmering afsnit 2.1-2.7 Anne Haxthausen IMM, DTU 1. Værdier og typer (bl.a. char, boolean, int, double) (afsnit 2.4) 2. Variable og konstanter (afsnit 2.3) 3. Sætninger (bl.a. assignments)

Læs mere

Oprids over grundforløbet i matematik

Oprids over grundforløbet i matematik Oprids over grundforløbet i matematik Dette oprids er tænkt som en meget kort gennemgang af de vigtigste hovedpointer vi har gennemgået i grundforløbet i matematik. Det er en kombination af at repetere

Læs mere

Differentialregning. Ib Michelsen

Differentialregning. Ib Michelsen Differentialregning Ib Michelsen Ikast 2012 Forsidebilledet Tredjegradspolynomium i blåt med rød tangent Version: 0.02 (18-09-12) Denne side er (~ 2) Indholdsfortegnelse Introduktion...5 Definition af

Læs mere

Algoritmer og invarianter

Algoritmer og invarianter Algoritmer og invarianter Iterative algoritmer Algoritmen er overordnet set een eller flere while eller for-løkker. Iterative algoritmer Algoritmen er overordnet set een eller flere while eller for-løkker.

Læs mere

π er irrationel Frank Nasser 10. december 2011

π er irrationel Frank Nasser 10. december 2011 π er irrationel Frank Nasser 10. december 2011 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Indhold 1 Introduktion

Læs mere

Rekursion og dynamisk programmering

Rekursion og dynamisk programmering Rekursion og dynamisk programmering Datastrukturer & Algoritmer, Dat C Forelæsning 12/10-2004 Henning Christiansen Rekursion: at en procedure kalder sig selv eller et antal metoder kalder hinanden gensidigt.

Læs mere

Introduktion til differentialregning 1. Jens Siegstad og Annegrethe Bak

Introduktion til differentialregning 1. Jens Siegstad og Annegrethe Bak Introduktion til differentialregning 1 Jens Siegstad og Annegrete Bak 16. juli 2008 1 Indledning I denne note vil vi kort introduktion til differentilregning, idet vi skal bruge teorien i et emne, Matematisk

Læs mere

Kompendium i faget. Matematik. Tømrerafdelingen. 2. Hovedforløb. Y = ax 2 + bx + c. (x,y) Svendborg Erhvervsskole Tømrerafdelingen Niels Mark Aagaard

Kompendium i faget. Matematik. Tømrerafdelingen. 2. Hovedforløb. Y = ax 2 + bx + c. (x,y) Svendborg Erhvervsskole Tømrerafdelingen Niels Mark Aagaard Kompendium i faget Matematik Tømrerafdelingen 2. Hovedforløb. Y Y = ax 2 + bx + c (x,y) X Svendborg Erhvervsskole Tømrerafdelingen Niels Mark Aagaard Indholdsfortegnelse for H2: Undervisningens indhold...

Læs mere

Opgave 1 Regning med rest

Opgave 1 Regning med rest Den digitale signatur - anvendt talteori og kryptologi Opgave 1 Regning med rest Den positive rest, man får, når et helt tal a divideres med et naturligt tal n, betegnes rest(a,n ) Hvis r = rest(a,n) kan

Læs mere

Omskrivningsregler. Frank Nasser. 10. december 2011

Omskrivningsregler. Frank Nasser. 10. december 2011 Omskrivningsregler Frank Nasser 10. december 2011 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Indhold 1 Introduktion

Læs mere

Maple. Skærmbilledet. Vi starter med at se lidt nærmere på opstartsbilledet i Maple. Værktøjslinje til indtastningsområdet. Menulinje.

Maple. Skærmbilledet. Vi starter med at se lidt nærmere på opstartsbilledet i Maple. Værktøjslinje til indtastningsområdet. Menulinje. Maple Dette kapitel giver en kort introduktion til hvordan Maple 12 kan benyttes til at løse mange af de opgaver, som man bliver mødt med i matematiktimerne på HHX. Skærmbilledet Vi starter med at se lidt

Læs mere

Induktive og rekursive definitioner

Induktive og rekursive definitioner Induktive og rekursive definitioner Denne note omhandler matematiske objekter, som formelt er opbygget fra et antal basale byggesten, kaldet basistilfælde eller blot basis, ved gentagen brug af et antal

Læs mere

Matematisk modellering og numeriske metoder

Matematisk modellering og numeriske metoder Matematisk modellering og numeriske metoder Morten Grud Rasmussen 14. september 016 1 Numerisk analyse 1.1 Grundlæggende numerik Groft sagt handler numerisk analyse om at bringe matematiske problemer på

Læs mere

dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet)

dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet) dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet) Efterår 2009 1 Simpel aritmetik på maskinniveau I SCO, appendix A, er det beskrevet, hvordan man adderer ikke-negative heltal

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den. maj 00. Kursusnavn Algoritmer og datastrukturer Kursus nr. 06. Tilladte hjælpemidler: Alle hjælpemidler. Vægtning af opgaverne: Opgave

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2 DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld

Læs mere

Grundlæggende køretidsanalyse af algoritmer

Grundlæggende køretidsanalyse af algoritmer Grundlæggende køretidsanalyse af algoritmer Algoritmers effektivitet Størrelse af inddata Forskellige mål for køretid Store -notationen Klassiske effektivitetsklasser Martin Zachariasen DIKU 1 Algoritmers

Læs mere

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag Forelæsning Uge 2 Torsdag Java syntax og style guide Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Brug

Læs mere

Datastrukturer (recap)

Datastrukturer (recap) Dictionaries Datastrukturer (recap) Data: Datastruktur = data + operationer herpå En ID (nøgle) + associeret data. Operationer: Datastrukturens egenskaber udgøres af de tilbudte operationer (API for adgang

Læs mere

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign 28 Algoritmedesign. Algoritmeskabelon for Del og Hersk. Eksempler på Del og Hersk algoritmer. Binær søgning i et ordnet array. Sortering ved fletning og Quicksort. Maksimal delsums problem. Tætteste par

Læs mere

Datastrukturer (recap)

Datastrukturer (recap) Dictionaries Datastrukturer (recap) Data: Datastruktur = data + operationer herpå En ID (nøgle) + associeret data. Operationer: Datastrukturens egenskaber udgøres af de tilbudte operationer (API for adgang

Læs mere

Om binære søgetræer i Java

Om binære søgetræer i Java Om binære søgetræer i Java Mads Rosendahl 7. november 2002 Resumé En fix måde at gemme data på er i en træstruktur. Måden er nyttig hvis man får noget data ind og man gerne vil have at det gemt i en sorteret

Læs mere

Newton-Raphsons metode

Newton-Raphsons metode Newton-Raphsons metode af John V. Petersen Indhold Indledning: Numerisk analyse og Newton-Raphsons metode... 2 Udlede Newtons iterations formel... 2 Sætning 1 Newtons metode... 4 Eksempel 1 konvergens...

Læs mere

Matematik. 1 Matematiske symboler. Hayati Balo,AAMS. August, 2014

Matematik. 1 Matematiske symboler. Hayati Balo,AAMS. August, 2014 Matematik Hayati Balo,AAMS August, 2014 1 Matematiske symboler For at udtrykke de verbale udsagn matematisk korrekt, så det bliver lettere og hurtigere at skrive, indføres en række matematiske symboler.

Læs mere

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo Philip Bille Nærmeste naboer. Vedligehold en dynamisk mængde S af elementer. Hvert element har en nøgle key[] og satellitdata data[]. operationer. PREDECESSOR(k): returner element med største nøgle k.

Læs mere

Matematisk modellering og numeriske metoder. Lektion 16

Matematisk modellering og numeriske metoder. Lektion 16 Matematisk modellering og numeriske metoder Lektion 16 Morten Grud Rasmussen 6. november, 2013 1 Interpolation [Bogens afsnit 19.3 side 805] 1.1 Interpolationspolynomier Enhver kontinuert funktion f på

Læs mere

Forslag til løsning af Opgaver til afsnittet om de naturlige tal (side 80)

Forslag til løsning af Opgaver til afsnittet om de naturlige tal (side 80) Forslag til løsning af Opgaver til afsnittet om de naturlige tal (side 80) Opgave 1 Vi skal tegne alle de linjestykker, der forbinder vilkårligt valgte punkter blandt de 4 punkter. Gennem forsøg finder

Læs mere

Algebra - Teori og problemløsning

Algebra - Teori og problemløsning Algebra - Teori og problemløsning, januar 05, Kirsten Rosenkilde. Algebra - Teori og problemløsning Kapitel -3 giver en grundlæggende introduktion til at omskrive udtryk, faktorisere og løse ligningssystemer.

Læs mere

Et udtryk på formena n kaldes en potens med grundtal a og eksponent n. Vi vil kun betragte potenser hvor grundtallet er positivt, altså a>0.

Et udtryk på formena n kaldes en potens med grundtal a og eksponent n. Vi vil kun betragte potenser hvor grundtallet er positivt, altså a>0. Konkrete funktioner Potenser Som udgangspunkt er brugen af potenser blot en forkortelse for at gange et tal med sig selv et antal gange. Hvis a Rskriver vi a 2 for a a a 3 for a a a a 4 for a a a a (1).

Læs mere

Kursus navn: Indledende programmering Kursus nr. 02101

Kursus navn: Indledende programmering Kursus nr. 02101 Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning

Læs mere

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Institut for Matematik og Datalogi Syddansk Universitet, Odense Onsdag den 0. juni 009, kl. 9 Alle sædvanlige hjælpemidler (lærebøger, notater, osv.)

Læs mere

Kapitel 2 Tal og variable

Kapitel 2 Tal og variable Tal og variable Uden tal ingen matematik - matematik handler om tal og anvendelse af tal. Matematik beskæftiger sig ikke udelukkende med konkrete problemer fra andre fag, og de konkrete tal fra andre fagområder

Læs mere

Symbolbehandlingskompetencen er central gennem arbejdet med hele kapitlet i elevernes arbejde med tal og regneregler.

Symbolbehandlingskompetencen er central gennem arbejdet med hele kapitlet i elevernes arbejde med tal og regneregler. Det første kapitel i grundbogen til Kolorit i 8. klasse handler om tal og regning. Kapitlet indledes med, at vores titalssystem som positionssystem sættes i en historisk sammenhæng. Gennem arbejdet med

Læs mere

Grundlæggende Matematik

Grundlæggende Matematik Grundlæggende Matematik Hayati Balo, AAMS August 2012 1. Matematiske symboler For at udtrykke de verbale udsagn matematisk korrekt, så det bliver lettere og hurtigere at skrive, indføres en række matematiske

Læs mere

3. klasse 6. klasse 9. klasse

3. klasse 6. klasse 9. klasse Børne- og Undervisningsudvalget 2012-13 BUU Alm.del Bilag 326 Offentligt Elevplan 3. klasse 6. klasse 9. klasse Matematiske kompetencer Status tal og algebra sikker i, er usikker i de naturlige tals opbygning

Læs mere

4. Snittets kædebrøksfremstilling og dets konvergenter

4. Snittets kædebrøksfremstilling og dets konvergenter Dette er den fjerde af fem artikler under den fælles overskrift Studier på grundlag af programmet SKALAGENERATOREN (forfatter: Jørgen Erichsen) 4. Snittets kædebrøksfremstilling og dets konvergenter Vi

Læs mere

Differentialregning Infinitesimalregning

Differentialregning Infinitesimalregning Udgave 2.1 Differentialregning Infinitesimalregning Noterne gennemgår begreberne differentialregning, og anskuer dette som et derligere redskab til vækst og funktioner. Noterne er supplement til kapitel

Læs mere

Repræsentation af tal

Repræsentation af tal Repræsentation af tal DM526 Rolf Fagerberg, 2009 Bitmønstre 01101011 0001100101011011... Bitmønstre skal fortolkes for at have en betydning: Tal (heltal, kommatal) Bogstaver Computerinstruktion (program)

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 15. marts, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

matx.dk Differentialregning Dennis Pipenbring

matx.dk Differentialregning Dennis Pipenbring mat.dk Differentialregning Dennis Pipenbring 0. december 00 Indold Differentialregning 3. Grænseværdi............................. 3. Kontinuitet.............................. 8 Differentialkvotienten

Læs mere

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

Definition : Et træ er en sammenhængende ikke-orienteret graf uden simple kredse. Sætning : En ikke-orienteret graf er et træ hvis og kun hvis der er

Definition : Et træ er en sammenhængende ikke-orienteret graf uden simple kredse. Sætning : En ikke-orienteret graf er et træ hvis og kun hvis der er Definition : Et træ er en sammenhængende ikke-orienteret graf uden simple kredse. Sætning : En ikke-orienteret graf er et træ hvis og kun hvis der er en unik simpel vej mellem ethvert par af punkter i

Læs mere

Her er et spørgsmål, du måske aldrig har overvejet: kan man finde to trekanter med samme areal?

Her er et spørgsmål, du måske aldrig har overvejet: kan man finde to trekanter med samme areal? Her er et spørgsmål, du måske aldrig har overvejet: kan man finde to trekanter med samme areal? Det er ret let at svare på: arealet af en trekant, husker vi fra vor kære folkeskole, findes ved at gange

Læs mere

Vektorer og lineær regression. Peter Harremoës Niels Brock

Vektorer og lineær regression. Peter Harremoës Niels Brock Vektorer og lineær regression Peter Harremoës Niels Brock April 2013 1 Planproduktet Vi har set, at man kan gange en vektor med et tal. Et oplagt spørgsmål er, om man også kan gange to vektorer med hinanden.

Læs mere

MATEMATIK B. Videooversigt

MATEMATIK B. Videooversigt MATEMATIK B Videooversigt 2. grads ligninger.... 2 CAS værktøj... 3 Differentialregning... 3 Eksamen... 5 Funktionsbegrebet... 5 Integralregning... 5 Statistik... 6 Vilkårlige trekanter... 7 71 videoer.

Læs mere

De rigtige reelle tal

De rigtige reelle tal De rigtige reelle tal Frank Villa 17. januar 2014 Dette dokument er en del af MatBog.dk 2008-2012. IT Teaching Tools. ISBN-13: 978-87-92775-00-9. Se yderligere betingelser for brug her. Indhold 1 Introduktion

Læs mere

Fibonacci følgen og Det gyldne snit

Fibonacci følgen og Det gyldne snit Fibonacci følgen og Det gyldne snit af John V. Petersen Indhold Fibonacci... 2 Fibonacci følgen og Binets formel... 3... 4... 6... 6 Bevis for Binets formel... 7 Binets formel fortæller os, at...... 9...

Læs mere

Integralregning Infinitesimalregning

Integralregning Infinitesimalregning Udgave 2.1 Integralregning Infinitesimalregning Noterne gennemgår begreberne integral og stamfunktion, og anskuer dette som et redskab til bestemmelse af arealer under funktioner. Noterne er supplement

Læs mere

De fire elementers kostbare spejl

De fire elementers kostbare spejl Projekt.6 Lineær algebra moderne og klassisk kinesisk De fire elementers kostbare spejl "Som bekendt anses matematikken for at være en meget vigtig videnskab. Denne bog om matematik vil derfor være af

Læs mere

Basale forudsætninger. Sortering ved fletning med tre bånd, i to faser.

Basale forudsætninger. Sortering ved fletning med tre bånd, i to faser. 25 Sortering III. Basale forudsætninger. Sortering ved fletning med tre bånd, i to faser. Sortering ved fletning, med fire bånd, i én fase (balanceret fletning). Polyfase fletning med tre bånd. Generaliseret

Læs mere

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Grådige algoritmer Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Læs mere

BRP 6.9.2006 Kursusintroduktion og Java-oversigt

BRP 6.9.2006 Kursusintroduktion og Java-oversigt BRP 6.9.2006 Kursusintroduktion og Java-oversigt 1. Kursusintroduktion 2. Java-oversigt (A): Opgave P4.4 3. Java-oversigt (B): Ny omvendings -opgave 4. Introduktion til næste kursusgang Kursusintroduktion:

Læs mere

Repræsentation af tal

Repræsentation af tal Repræsentation af tal DM534 Rolf Fagerberg Bitmønstre 01101011 0001100101011011... Bitmønstre skal fortolkes for at have en betydning: Tal (heltal, decimaltal (kommatal)) Bogstaver Computerinstruktion

Læs mere

Kapitel 2. Differentialregning A

Kapitel 2. Differentialregning A Kapitel 2. Differentialregning A Indhold 2.2 Differentiabilitet og tangenter til grafer... 2 2.3 Sammensat funktion, eksponential-, logaritme- og potensfunktioner... 7 2.4 Regneregler for differentiation

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den 6. maj 0. Kursusnavn: Algoritmer og datastrukturer I Kursus nr. 005. Tilladte hjælpemidler: Skriftlige hjælpemidler. Varighed: timer Vægtning

Læs mere

PeterSørensen.dk : Differentiation

PeterSørensen.dk : Differentiation PeterSørensen.dk : Differentiation Betydningen af ordet differentialkvotient...2 Sekant...2 Differentiable funktioner...3 Bestemmelse af differentialkvotient i praksis ved opgaveløsning...3 Regneregler:...3

Læs mere

Grafregnerkravet på hf matematik tilvalg

Grafregnerkravet på hf matematik tilvalg Grafregnerkravet på hf matematik tilvalg Dette dokument er en sammenskrivning af uddrag af følgende skrifter: Undervisningsvejledning nr. 21 for matematik i HF (september 1995); findes på adressen: http://us.uvm.dk/gymnasie/almen/vejledninger/undervishf/hfvej21.htm;

Læs mere

Evaluering af matematik undervisning

Evaluering af matematik undervisning Evaluering af matematik undervisning Udarbejdet af Khaled Zaher, matematiklærer 6-9 klasse og Boushra Chami, matematiklærer 2-5 klasse Matematiske kompetencer. Fællesmål efter 3.klasse indgå i dialog om

Læs mere

ALMINDELIGT ANVENDTE FUNKTIONER

ALMINDELIGT ANVENDTE FUNKTIONER ALMINDELIGT ANVENDTE FUNKTIONER I dette kapitel gennemgås de almindelige regnefunktioner, samt en række af de mest nødvendige redigerings- og formateringsfunktioner. De øvrige redigerings- og formateringsfunktioner

Læs mere

Kapitel 7 Matematiske vækstmodeller

Kapitel 7 Matematiske vækstmodeller Matematiske vækstmodeller I matematik undersøger man ofte variables afhængighed af hinanden. Her ser man, at samme type af sammenhænge tit forekommer inden for en lang række forskellige områder. I kapitel

Læs mere

Spilstrategier. 1 Vindermængde og tabermængde

Spilstrategier. 1 Vindermængde og tabermængde Spilstrategier De spiltyper vi skal se på her, er primært spil af følgende type: Spil der spilles af to spillere A og B som skiftes til at trække, A starter, og hvis man ikke kan trække har man tabt. Der

Læs mere

i x-aksens retning, så fås ). Forskriften for g fås altså ved i forskriften for f at udskifte alle forekomster af x med x x 0

i x-aksens retning, så fås ). Forskriften for g fås altså ved i forskriften for f at udskifte alle forekomster af x med x x 0 BAndengradspolynomier Et polynomium er en funktion på formen f ( ) = an + an + a+ a, hvor ai R kaldes polynomiets koefficienter. Graden af et polynomium er lig med den højeste potens af, for hvilket den

Læs mere

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer:

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer: Sortering Sortering Input: Output: n tal De n tal i sorteret orden Eksempel: Kommentarer: 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 Sorteret orden kan være stigende eller faldende. Vi vil i dette kursus

Læs mere

Kvadratrodsberegning ved hjælp af de fire regningsarter

Kvadratrodsberegning ved hjælp af de fire regningsarter Kvadratrodsberegning ved hjælp af de fire regningsarter Tidligt i historien opstod et behov for at beregne kvadratrødder med stor nøjagtighed. Kvadratrødder optræder i forbindelse med retvinklede trekanter,

Læs mere

Differential- regning

Differential- regning Differential- regning del () f () m l () 6 Karsten Juul Indhold Tretrinsreglen 59 Formler for differentialkvotienter64 Regneregler for differentialkvotienter67 Differentialkvotient af sammensat funktion7

Læs mere

Grafer og graf-gennemløb

Grafer og graf-gennemløb Grafer og graf-gennemløb Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges). Dvs. ordnede par af knuder. Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges).

Læs mere

og til summer af stambrøker. Bemærk: De enkelte brøker kan opskrives på flere måder som summer af stambrøker.

og til summer af stambrøker. Bemærk: De enkelte brøker kan opskrives på flere måder som summer af stambrøker. Hvad er en brøk? Når vi taler om brøker i dette projekt, mener vi tal på formen a, hvor a og b er hele tal (og b b 0 ), fx 2,, 3 og 3 7 13 1. Øvelse 1 Hvordan vil du forklare, hvad 7 er? Brøker har været

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter Skriftlig eksamen i Datalogi Modul 1 Vinter 1998/99 Opgavesættet består af 5 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 16% Opgave 2 12% Opgave 3 10% Opgave

Læs mere

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Institut for Matematik og Datalogi Syddansk Universitet, Odense Mandag den 7. juni 00, kl. 9 Alle sædvanlige hjælpemidler (lærebøger, notater, osv.)

Læs mere

Euklids algoritme og kædebrøker

Euklids algoritme og kædebrøker Euklids algoritme og kædebrøker Michael Knudsen I denne note vil vi med Z, Q og R betegne mængden af henholdsvis de hele, de rationale og de reelle tal. Altså er { m } Z = {..., 2,, 0,, 2,...} og Q = n

Læs mere

Introduktion til cosinus, sinus og tangens

Introduktion til cosinus, sinus og tangens Introduktion til cosinus, sinus og tangens Jes Toft Kristensen 24. maj 2010 1 Forord Her er en lille introduktion til cosinus, sinus og tangens. Det var et af de emner jeg selv havde svært ved at forstå,

Læs mere

Matematik opgave Projekt afkodning Zehra, Pernille og Remuss

Matematik opgave Projekt afkodning Zehra, Pernille og Remuss Matematik opgave Projekt afkodning Zehra, Pernille og Remuss Opgave A Sæt de overstående symboler ind i en matematisk sammenhæng der gør dem forståelige. Det kan være som en sætning eller med tal og bogstaver

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter Skriftlig eksamen i Datalogi Modul 1 Sommer 1999 Opgavesættet består af 5 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 15% Opgave 2 15% Opgave 3 8% Opgave

Læs mere

Afstande, skæringer og vinkler i rummet

Afstande, skæringer og vinkler i rummet Afstande, skæringer og vinkler i rummet Frank Villa 2. maj 202 c 2008-20. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Indhold

Læs mere

qwertyuiopåasdfghjklæøzxcvbnmqw ertyuiopåasdfghjklæøzxcvbnmqwert yuiopåasdfghjklæøzxcvbnmqwertyui Polynomier opåasdfghjklæøzxcvbnmqwertyuiopå

qwertyuiopåasdfghjklæøzxcvbnmqw ertyuiopåasdfghjklæøzxcvbnmqwert yuiopåasdfghjklæøzxcvbnmqwertyui Polynomier opåasdfghjklæøzxcvbnmqwertyuiopå qwertyuiopåasdfghjklæøzxcvbnmqw ertyuiopåasdfghjklæøzxcvbnmqwert yuiopåasdfghjklæøzxcvbnmqwertyui Polynomier opåasdfghjklæøzxcvbnmqwertyuiopå Kort gennemgang af polynomier og deres egenskaber. asdfghjklæøzxcvbnmqwertyuiopåasd

Læs mere

Andengradsligninger. Frank Nasser. 11. juli 2011

Andengradsligninger. Frank Nasser. 11. juli 2011 Andengradsligninger Frank Nasser 11. juli 2011 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Indhold 1 Introduktion

Læs mere

ØVEHÆFTE FOR MATEMATIK C FORMLER OG LIGNINGER

ØVEHÆFTE FOR MATEMATIK C FORMLER OG LIGNINGER ØVEHÆFTE FOR MATEMATIK C FORMLER OG LIGNINGER INDHOLDSFORTEGNELSE 0. FORMELSAMLING TIL FORMLER OG LIGNINGER... 2 Tal, regneoperationer og ligninger... 2 Isolere en ubekendt... 3 Hvis x står i første brilleglas...

Læs mere

Løsning af simple Ligninger

Løsning af simple Ligninger Løsning af simple Ligninger Frank Nasser 19. april 2011 c 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Bemærk:

Læs mere

Matema10k. Matematik for hhx C-niveau. Arbejdsark til kapitlerne i bogen

Matema10k. Matematik for hhx C-niveau. Arbejdsark til kapitlerne i bogen Matema10k Matematik for hhx C-niveau Arbejdsark til kapitlerne i bogen De følgende sider er arbejdsark og opgaver som kan bruges som introduktion til mange af bogens kapitler og underemner. De kan bruges

Læs mere

Det er en af de hyppigst forekommende udregninger i den elementære talbehandling at beregne gennemsnit eller middeltal af en række tal.

Det er en af de hyppigst forekommende udregninger i den elementære talbehandling at beregne gennemsnit eller middeltal af en række tal. Tre slags gennemsnit Allan C. Malmberg Det er en af de hyppigst forekommende udregninger i den elementære talbehandling at beregne gennemsnit eller middeltal af en række tal. For mange skoleelever indgår

Læs mere

Bevisteknikker (relevant både ved design og verifikation)

Bevisteknikker (relevant både ved design og verifikation) Bevisteknikker 1 Bevisteknikker (relevant både ved design og verifikation) Bevisførelse ved modstrid (indirekte bevis) Antag, at det givne teorem er falsk Konkluder, at dette vil føre til en modstrid Teorem:

Læs mere

Grundlæggende Matematik

Grundlæggende Matematik Grundlæggende Matematik Hayati Balo, AAMS Juli 2013 1. Matematiske symboler For at udtrykke de verbale udsagn matematisk korrekt, så det bliver lettere og hurtigere at skrive, indføres en række matematiske

Læs mere

Baggrundsnote om logiske operatorer

Baggrundsnote om logiske operatorer Baggrundsnote om logiske operatorer Man kan regne på udsagn ligesom man kan regne på tal. Regneoperationerne kaldes da logiske operatorer. De tre vigtigste logiske operatorer er NOT, AND og. Den første

Læs mere

Projekt 3.5 faktorisering af polynomier

Projekt 3.5 faktorisering af polynomier Projekt 3.5 faktorisering af polynomier Hvilke hele tal går op i tallet 60? Det kan vi få svar på ved at skrive 60 som et produkt af sine primtal: 60 3 5 Divisorerne i 60 er lige præcis de tal, der kan

Læs mere

Indhold. Maskinstruktur... 3. Kapitel 1. Assemblersprog...3. 1.1 Indledning...3 1.2 Hop-instruktioner... 7 1.3 Input og output...

Indhold. Maskinstruktur... 3. Kapitel 1. Assemblersprog...3. 1.1 Indledning...3 1.2 Hop-instruktioner... 7 1.3 Input og output... Indhold Maskinstruktur... 3 Kapitel 1. Assemblersprog...3 1.1 Indledning...3 1.2 Hop-instruktioner... 7 1.3 Input og output... 9 Kapitel 2. Maskinkode... 13 2.1 Den fysiske maskine... 13 2.2 Assemblerens

Læs mere

Introduktion til Laplace transformen (Noter skrevet af Nikolaj Hess-Nielsen sidst revideret marts 2013)

Introduktion til Laplace transformen (Noter skrevet af Nikolaj Hess-Nielsen sidst revideret marts 2013) Introduktion til Laplace transformen (oter skrevet af ikolaj Hess-ielsen sidst revideret marts 23) Integration handler ikke kun om arealer. Tværtimod er integration basis for mange af de vigtigste værktøjer

Læs mere

Komplekse tal. Mikkel Stouby Petersen 27. februar 2013

Komplekse tal. Mikkel Stouby Petersen 27. februar 2013 Komplekse tal Mikkel Stouby Petersen 27. februar 2013 1 Motivationen Historien om de komplekse tal er i virkeligheden historien om at fjerne forhindringerne og gøre det umulige muligt. For at se det, vil

Læs mere

Bevisteknikker. Bevisteknikker (relevant både ved design og verifikation) Matematisk induktion. Matematisk induktion uformel beskrivelse

Bevisteknikker. Bevisteknikker (relevant både ved design og verifikation) Matematisk induktion. Matematisk induktion uformel beskrivelse Bevisteknikker Bevisteknikker (relevant både ved design og verifikation) Bevisførelse ved modstrid (indirekte bevis) Antag, at det givne teorem er falsk Konkluder, at dette vil føre til en modstrid Teorem:

Læs mere

Matricer og lineære ligningssystemer

Matricer og lineære ligningssystemer Matricer og lineære ligningssystemer Grete Ridder Ebbesen Virum Gymnasium Indhold 1 Matricer 11 Grundlæggende begreber 1 Regning med matricer 3 13 Kvadratiske matricer og determinant 9 14 Invers matrix

Læs mere

Læringsprogram. Numeriske metoder. Matematik A Programmering C Studieområdet. Roskilde Tekniske Gymnasium Klasse 3.4

Læringsprogram. Numeriske metoder. Matematik A Programmering C Studieområdet. Roskilde Tekniske Gymnasium Klasse 3.4 Læringsprogram Numeriske metoder Matematik A Programmering C Studieområdet Roskilde Tekniske Gymnasium Klasse 3.4 Lau Lund Leadbetter Mikkel Karoli Johnsen Tobias Sønderskov Hansen Lineær regression ved

Læs mere

2 Erik Vestergaard www.matematikfysik.dk

2 Erik Vestergaard www.matematikfysik.dk Erik Vestergaard www.matematikfysik.dk Erik Vestergaard www.matematikfysik.dk 3 Lineære funktioner En vigtig type funktioner at studere er de såkaldte lineære funktioner. Vi skal udlede en række egenskaber

Læs mere

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004 Københavns Universitet Naturvidenskabelig Embedseksamen DATALOGI 1E Skriftlig eksamen torsdag den 3. juni 2004 Opgaverne vægtes i forhold til tidsangivelsen herunder, og hver opgaves besvarelse bedømmes

Læs mere

fortsætte høj retning mellem mindre over større

fortsætte høj retning mellem mindre over større cirka (ca) omtrent overslag fortsætte stoppe gentage gentage det samme igen mønster glat ru kantet høj lav bakke lav høj regel formel lov retning højre nedad finde rundt rod orden nøjagtig præcis cirka

Læs mere