Procedurer og funktioner - iteration og rekursion

Relaterede dokumenter
På opdagelse i Mandelbrot-fraktalen En introduktion til programmet Mandelbrot

sammenhänge for C-niveau i stx 2013 Karsten Juul

Talrækker. Aktivitet Emne Klassetrin Side

Algoritmer og invarianter

Kom godt i gang med OneDrive

Vejledning til aflevering og fremsendelse af afsluttende opgave December 2013

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

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

matematik Demo excel trin 2 bernitt-matematik.dk 1 excel by bernitt-matematik.dk

Dansk Datalogi Dyst 2015 DDD Runde 2

Rapport Bjælken. Derefter lavede vi en oversigt, som viste alle løsningerne og forklarede, hvad der gør, at de er forskellige/ens.

Dokumentation af programmering i Python 2.75

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign

ENK Manual for Entreprenør

Allan C. Malmberg. Terningkast

Side 1 af 10. Lydbreve. Indhold. Indhold...1 Forord...2 Lydoptager...2 Ændring af indtalt lyd...4 Sende dit lydbrev...8 Lyde i Worddokumenter...

Rekursion C#-version

Kom i gang-opgaver til differentialregning

Regneark II Calc Open Office

Sproget Rascal (v. 2)

Dannelse af overflytningsordrer mellem lokationer foretages via menupunktet Beregn plan under Køb - Planlægning Indkøbskladder.

Brug Photo Story 3 en let introduktion

Indholdsfortegnelse. Indhold

Lineære modeller. Taxakørsel: Et taxa selskab tager 15 kr. pr. km man kører i deres taxa. Hvis vi kører 2 km i taxaen koster turen altså

Selvstudium 1, Diskret matematik

Formler, ligninger, funktioner og grafer

Betjeningsvejledning. for. UniRace

VELKOMMEN TIL PHOTO STORY FOR WINDOWS

Kort om Eksponentielle Sammenhænge

Excel-4: Diagrammer og udskrift

Vejledning til Photofiltre nr. 117 Side 1

Formler og diagrammer i OpenOffice Calc

SMK menuen SMK STATISTISK MÅLERKONTROL

Indholdsfortegnelse resultat- & kritikprogrammet.

At lave dit eget spørgeskema

Formler og diagrammer i Excel 2000/2003 XP

Opgaver om koordinater

Newtons afkølingslov

Fra tilfældighed over fraktaler til uendelighed

Søren Christiansen

P (n): rekursiv beregning af f n kræver f n beregninger af f 1. P (n) er sand for alle n 2.

18 Multivejstræer og B-træer.

Vejledning i brug af Golfbox

Eksponentiel regression med TI-Nspire ved transformation af data

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

Linket viser jer frem til billedet nedenfor, her skal du blot skrive jeres brugernavn og adgangskode. Indtast din adgangskode her:

Vejledning til brug af Foreningsportalen

Microsoft Word fremgangsmåde til Firma skovtur

Kom godt i gang med elektroniske ansøgninger om parallelimport Indhold

Få navn på analysenr. i excel-fil og ind i pivottabel med data fra qlikview

Første møde med skærmbilledet i After Effects 6,5 PRO Lidt om animering

I NV4000 Som broderimaskine.

D1 1 Partikelformede bjergarter

MANUAL AGROSOFT POCKETPIGS. Ver SKIOLD GØR EN FORSKEL!

Diagrammer visualiser dine tal

Eksempel på logistisk vækst med TI-Nspire CAS

Manual til overføring af fotografier fra kamera til harddisk.

Stx matematik B december Delprøven med hjælpemidler

6. Eventstyret programmering og Windows

Optimeret Ruteforslag

Dynamisk programmering

Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Ideen er simpel:

Opret og godkend betalinger i mapper

Vejledning til aflevering og fremsendelse af afsluttende opgave Januar 2016

Manual for installation og brug af Ad-aware version 2007

Betjeningsvejledning. System Alarmpanel xx S2s

Opgave Opgave 2 Andengradsligningen løses, idet. Opgave er en løsning til ligningen, da:

GrundlÄggende variabelsammenhänge

Alt elektronik heri er købt via og arduino udviklingssoftware er hentet fra

Højere Handelseksamen Handelsskolernes enkeltfagsprøve August Matematik Niveau B. Delprøven uden hjælpemidler

matematik Demo excel trin 1 preben bernitt bernitt-matematik.dk 1 excel by bernitt-matematik.dk

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.

Matematik A-niveau STX 24. maj 2016 Delprøve 2 VUC Vestsjælland Syd.

22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned.

Deskriptiv statistik. Version 2.1. Noterne er et supplement til Vejen til matematik AB1. Henrik S. Hansen, Sct. Knuds Gymnasium

TrivselAPV 2013 Teknisk guide til arbejdsmiljøgrupperne

UNI Login brugeradministration

Udskriv kort. Før udskrivning af et kort kan du eventuelt vælge at indtegne et/flere udskriftsområder. (I PLUS versionen kun ét).

Velkommen til ABC Analyzer! Grundkursusmanual 2 vil introducere dig til ABC Analyzers mere avancerede funktioner, bl.a.:

Tillykke med din nye ipad. Denne guide er til dig, der har et Apple-ID i forvejen

GPS og geometri - 1 Baggrund. lineære og ikke-lineære ligninger. Køreplan Matematik 1 - FORÅR 2007

DM02 opgaver ugeseddel 2

DKK Rally-lydighed, Øvede-klassen. 40. Fristende 8-tal

19 Hashtabeller. Noter. PS1 -- Hashtabeller. Hashing problemet. Hashfunktioner. Kollision. Søgning og indsættelse.

dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet)

Abstrakte datatyper C#-version

Kort introduktion til e-boks

Om at udregne enkeltstående hexadecimaler i tallet pi

Vigtige funktioner i Word 2003

Titel felt skal udfyldes både på dansk og engelsk -mangler dette skal du kontakte producenten

Modelbanestyring med PC Indholdsfortegnelse

bruge en formel-samling

Formler og diagrammer i Excel 2007

Intendantur Del 3 Guide til webapplikation til bestilling af mad

Oprettelse af Nyansat (ikke ansat hos HE Vest i forvejen) Ny medarbejder (ansat hos HE Vest i forvejen)

3.0 Velkommen til manualen for kanalen Shift Introduktion til kanalen Hvad er et spot? Opret et nyt spot 2

T A L K U N N E N. Datasæt i samspil. Krydstabeller Grafer Mærketal. INFA Matematik Allan C

Transkript:

Procedurer og funktioner - iteration og rekursion Procedurer De første procedurer vi så på var knyttet til handlinger, der skulle udføres, fx at klikke på en knap for at lukke en form eller afslutte et program. Eksempel 1 procedure TForm1.Button1Click(Sender: TObject); close Eksempel 2 Vi har også set på en klik-procedure, der kalder en anden procedure. I dette eksempel er det proceduren TForm1.Button2Click der kalder proceduren firkant: procedure firkant(x,y,d: integer); with form1.canvas do moveto(x,y); lineto(x+d,y); lineto(x+d,y+d); lineto(x,y+d); lineto(x,y); procedure TForm1.Button2Click(Sender: TObject); var x,y,l: integer; x:=20; y:=20; l:=200; while l>=100 do firkant(x,y,l); l:=l-40; Bemærk rækkefølgen af procedurerne. Den nederste procedure skal bruge proceduren firkant, derfor skal proceduren firkant stå først i kildeteksten til programmet. Den første linje i en procedure kaldes procedurehovedet. I den står procedurens navn, og der kan være en liste med formelle parametre: procedure firkant(x,y,d: integer); I dette tilfælde er der tre formelle parametre, nemlig de tre integer-variable x, y og d. Når proceduren firkant kaldes, sker det med en programlinje som denne firkant(x,y,l); hvor x, y og l kaldes de aktuelle parametre. Første gang proceduren firkant kaldes, har de tre aktuelle parametre værdierne 20, 20 og 200. Ved de efterfølgende kald er værdien af l mindsket med 40. 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 1

Opgave 1 Forklar, at løkkestrukturen i programmet svarer til, at der udføres følgende procedurekald: firkant(20,20,200); firkant(20,20,160); firkant(20,20,120); firkant(20,20,80); firkant(20,20,40); Ved et procedurekald som firkant(20,20,200) bliver værdien 20 overført til parameteren x i proceduren firkant, værdien 20 bliver overført til parameteren y, og værdien 200 bliver overført til parameteren d. Herefter udføres programlinjerne i proceduren med disse værdier for x, y og d. Når proceduren er afsluttet (fordi alle linjer i proceduren er gennemløbet), vender programmet tilbage til den klik-procedure, hvorfra firkant blev kaldt. Opgave 2 Følg med i processen ved brug af watch-vindue og Trace Into-knappen. Iteration og rekursion Klik-proceduren og firkant-proceduren på forrige side er eksempler på iterative procedurer, dvs. procedurer, der gennemføres ved at udføre programlinjerne i rækkefølge, evt. med brug af gentagelser og betingelser. Der findes også en anden mulighed, nemlig rekursive procedurer. Herved forstår vi procedurer, der kalder sig selv. I forbindelse med funktioner kommer vi ind på fordele og ulemper ved brug af rekursion. Eksempel 3, Iteration Vi ser på firkant-proceduren igen, men ændrer i klik-proceduren, så der kun tegnes én firkant. procedure firkant(x,y,d: integer); with form1.canvas do moveto(x,y); lineto(x+d,y); lineto(x+d,y+d); lineto(x,y+d); lineto(x,y); procedure TForm1.Button2Click(Sender: TObject); firkant(20,20,200); De to procedurer er iterative. Alle programlinjer gennemløbes i rækkefølge, og hver linje kun én gang. Hvis man vil tegne flere firkanter indeni hinanden, fx således at der kommer små firkanter i hjørnerne på den store firkant, må man tilføje ekstra kald af proceduren firkant i klik-proceduren, fx firkant(20,20,40); firkant(180,20,40); firkant(180,180,40); firkant(20,180,40); {øverste venstre hjørne} {øverste højre hjørne} {nederste højre hjørne} {nederste venstre hjørne} 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 2

Hvis man også vil have tegnet små firkanter i hjørnerne af de 4 firkanter, skal man tilføje yderligere 16 linjer med kald af proceduren firkant. Det kan selvfølgelig lade sig gøre, men der findes en fiksere metode, nemlig brugen af rekursion. Eksempel 4, Rekursion Vi tilføjer 4 linjer med kald af firkant-proceduren, dvs. at proceduren kalder sig selv. procedure firkant(x,y,d: integer); var d2,d3: integer; with form1.canvas do moveto(x,y); lineto(x+d,y); lineto(x+d,y+d); lineto(x,y+d); lineto(x,y); d2:=round(2*d/3); d3:=round(d/3); if d>4 then firkant(x,y,d3); firkant(x+d2,y,d3); firkant(x+d2,y+d2,d3); firkant(x,y+d2,d3); procedure TForm1.Button2Click(Sender: TObject); firkant(20,20,200); De to variable d2 og d3 er tilføjet for at kunne nøjes med at udregne koordinater én gang. Det sparer lidt tid. Regneoperationen d/3 og 2*d/3 giver som resultat reelle tal. De bliver konverteret til hele tal ved brug af funktionen round, d3:=round(d/3). De fire linjer med kald af proceduren firkant svarer til dem, vi satte ind i den iterative procedure i eksempel 3. Men det ser ud til, at spøgen med små firkanter i hjørnerne gentager sig. Hvordan går det til? Forklaringen er, at når firkant-proceduren første gang kommer til linjen med firkant(x,y,d3), så kaldes firkant-proceduren med de nye (mindre) kantlængder, og så bliver de tegnet, inden resten af den oprindelige firkant bliver gjort færdig. Systemet er så at sige, at øverste venstre hjørne tegnes færdig først., så øverste højre hjørne, osv. 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 3

Det kan man se ved at indføje en sladre-meddelelse i form af en ShowMessage-boks inde i firkantproceduren: if d>20 then Showmessage('d='+inttostr(d)); Med d>20 skal man kun svare OK 16 gange. Med d>6 skal man svare OK 64 gange. Det betaler sig at begynde med at sammenligne d med et stort tal, så kan man altid nærme sig d>6 eller noget i den retning... Her er brugt d>6. Hver gang de fire firkanter er tegnet færdig, undersøger Delphi, om d>6, og hvis det er tilfældet udskrives meldingen om d-værdien. Funktioner Vi kender bl.a. nogle funktioner, der konverterer text til integer eller integer til tekst, fx og Edit2.Text:=IntToStr(beloeb) beloeb:=strtoint(edit2.text); I eksempel 4 brugte vi også muligheden for at konvertere mellem real og integer, d3:=round(d/3) Fælles for funktionerne er, at de arbejder på en elle anden størrelse, og leverer en anden størrelse som resultat, nøjagtig som man i matematik kan bruge funktioner til at beregne fx sin(47). Eksempel 5 Man kan definere sine egne funktioner. Som eksempel definerer vi en funktion, der kan beregne Fibonacci-tal. Fibonacci-tallene er den talrække der fremkommer, når man starter med 1 og 1, og derefter lader det næste tal være summen af de to forrige. Det giver følgende talrække: 1-1 - 2-3 - 5-8 - 13-21 - 34-55 - 89-144 - 233-377 - 610-987 osv. På de følgende sider skal vi se tre funktioner, der alle kan beregne det n te Fibonacci-tal. 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 4

Eksempel 6 Iterativ funktion til beregning af fibonacci-tal Beregnings-funktionen function fibi(n: integer): longint; var i,f,g,h: longint; f:=1; g:=1; if n>2 then for i:=3 to n do h:=f+g; f:=g; g:=h; fibi:=g; end else fibi:=1; Den procedure, der kalder beregningsfunktionen procedure TForm1.Button1Click(Sender: TObject); var x: longint; if edit1.text<>'' then x:=strtoint(edit1.text); edit2.text:=inttostr(fibi(x)); Hvis der er indtastet noget i edit1-boksen, omsættes textstrengen til et tal (x). Det x te fibonacci-tal beregnes af funktionen fibi(x), resultatet omsættes til en textstreng, som skrives i edit2-boksen. Det 4. fibonacci-tal findes ved at gennemføre følgende: 1) n har værdien 4 2) f:=1; g:=1 (det er værdierne af de to første fibonacci-tal) 3) i:=3 4) h:=f+g; f:=g; g:=h; h:=1+1 (=2); f:=1; g:=2 5) i:=4 6) h:=f+g; f:=g; g:=h; h:=1+2 (=3); f:=2; g:=3 7) nu er i=n, derfor ikke flere beregninger 8) Værdien af funktionen fås ved at sætte fibi:=g (=3) n 4 4 4 i 3 4 h 2 3 f 1 1 2 g 1 2 3 Større fibonacci-tal findes ved at fortsætte med beregner som i pkt. 5) og 6). I skemaet herunder viser søjlen med n=7, n=10 osv. hvor langt man skal fortsætte for at beregne det 7. eller det 10. fibonacci-tal. n=4 n=7 n=10 n=13 i 3 4 5 6 7 8 9 10 11 12 13 h 2 3 5 8 13 21 34 55 89 144 233 f 1 1 2 3 5 8 13 21 34 55 89 144 g 1 2 3 5 8 13 21 34 55 89 144 233 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 5

Eksempel 7 Rekursiv funktion til beregning af fibonacci-tal Beregnings-funktionen function fibr(n: integer): longint; var res: longint; if n>2 then res:=fibr(n-1)+fibr(n-2) else res:=1; fibr:=res; Den procedure, der kalder beregningsfunktionen procedure TForm1.Button1Click( Sender: TObject); var x: longint; if edit1.text<>'' then x:=strtoint(edit1.text); edit2.text:=inttostr(fibi(x)); Hvis der er indtastet noget i edit1-boksen, omsættes textstrengen til et tal (x). Det x te fibonacci-tal beregnes af funktionen fibr(x), resultatet omsættes til en textstreng, som skrives i edit2-boksen. Det 4. fibonacci-tal findes ved at gennemføre følgende: 1) Resultater er summen af de to foregående fibonacci-tal (fibr(n-1)+fibr(n-2)), dvs. res:=fibr(3)+fibr(2) 2) Så må fibr(3) findes. Vi starter forfra med nye variable, og har n=3. Resultater er igen summen af de to foregående fibonacci-tal, dvs. res:=fibr(2)+fibr(1). 3) Så må fibr(2) findes. Vi starter forfra med nye variable, og har n=2. Resultater er 1. 4) Resultatet kan sættes ind i stedet for fibr(2) i beregningen af fibr(3), men vi mangler at finde fibr(1). 5) Så må fibr(1) findes. Vi starter forfra med nye variable, og har n=1. Resultater er 1. 6) Resultatet kan sættes ind i stedet for fibr(1) i beregningen af fibr(3). Alt i alt res:=1+1, som kan indsættes i stedet for fibr(3) i beregningen af fibr(4). Men i den beregning mangler vi stadig at finde fibr(2). 7) Så må fibr(2) findes. Vi starter forfra med nye variable, og har n=2. Resultater er 1. 8) Resultatet kan sættes ind i stedet for fibr(2) i beregningen af fibr(4). Alt i alt res:=2+1. 9) Resultatet? fibr(4)=3. Bemærkning: 1) Læg mærke til, hvordan kasserne er placeret i forhold til hinanden. Man siger, at de danner et træ. Det vender godt nok på hovedet, så roden er kassen med firb(4), og de øvrige kasser udgør træets grene. 2) Læg også mærke til, hvordan træet gennemløbes fra venstre mod højre. Bemærk, at vi i punkt 7) herover må beregne fibr(2) én gang til. Systemet kan altså ikke udnytte, at fibr(2) er beregnet én gang før (i punkt 3). Det er selvfølgelig med til at gøre denne metode langsommere end den iterative metode i eksempel 6. 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 6

Eksempel 8 Rekursiv funktion (med hukommelse) til beregning af fibonacci-tal Efter beregningen af fibr(4) så vi, at man kommer til at beregne den samme funktionsværdi flere gange, når man gennmløber beregnings-træet. I dette ekseemepel vil vi prøve at omgå dette problem ved at indbygge en slags hukommelse i den rekursive funktion. Beregnings-funktionen function fibrh(n: integer): longint; var res: longint; if n>2 then if huk[n-2]=0 then huk[n-2]:=fibrh(n-2); if huk[n-1]=0 then huk[n-1]:=fibrh(n-1); res:=huk[n-1]+huk[n-2]; end else res:=1; fibrh:=res; Som hukommelse bruges et array, der naturligvis skal være erklæret på forhånd. Array et skal nulstilles ved programstart. Den procedure, der kalder beregningsfunktionen procedure TForm1.Button3Click( Sender: TObject); var x: longint; if edit1.text<>'' then x:=strtoint(edit1.text); edit4.text:=inttostr(fibrh(x)); var huk: array[1..100] of longint; TForm1.OnActivate(Sender: TObject); var i: integer; for i:=1 to antal do huk[i]:=0; Det snedige ved denne rekursive procedure er, at hvert fibonacci-tal kun skal beregnes én gang. Så snart det er beregnet, bliver det placeret i hukommelsen, og derefter er det fibonacci-tallet i hukommelsen, der bliver brugt ved de efterfølgende kald af funktionen. Omkostningen ved metoden er, at der skal afsættes plads til et array, og at man hele tiden skal spørge, om værdien nu er beregnet i forvejen. Men tidsmæssigt viser det sig, at der er en enorm gevinst at hente ved denne metode, især når man skal beregne store fibonacci-tal. 10 Sammenligning af de tre funktioner til beregning af fibonacci-tal I programmet til højre kan man beregne fibonacci-tal ved de tre metoder, der er omtalt i eksemplerne 6-8. På en moderne Pentium-maskine ser man ikke, at det tager tid at få beregnet fibonacci-tal med den iterative funktion. Med den rekursive funktion tager beregning af det 38. fibonaccital på en 500MHz PentiumIII-maskine ca. 3 sekunder. Den rekursive funktion med hukommelse svarer tidsmæssigt til den iterative, man mærker ikke, at beregningen tager tid. Man bør selvfølgelig tilføje en timer i programmet, så man kan måle den tid, beregningerne tager. Når det er gjort, kan man efterfølgende undersøge sammenhængen mellem størrelsen af n og den tid beregningen tog, og lave en grafisk afbildning at tid som funktion af n. Den grafiske afbildning vil formodentlig vise en voldsom stigning i tidsforbruget ved den rekursive beregningsmetode, medens stigningen i tidsforbruget ved den iterative metode og den rekursive metode med hukommelse er moderat. 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 7

Opgave 11 Vis teoretisk at beregningstiden vokser eksponentielt ved den rekursive metode. Eksempel 12 Tidsmåling i den rekursive fibonaccci I eksempel 7 så vi den rekursive beregningsfunktion og den klik-procedure, der kalder beregningsfunktionen. Her følger en ny udgave af den klik-procedure, der kalder beregningsfunktionen. Forskellen er, at den nye procedure har indbygget tidsmåling: procedure TForm1.Button2Click(Sender: TObject); var x, start_abs, slut_abs: longint; dtstart, starttid, sluttid : TDateTime; Hour1, Min1, Sec1, MSec1, Hour2, Min2, Sec2, MSec2: Word; {standard-tidsvariabel} {hjælpevariable} if edit1.text<>'' then x:=strtoint(edit1.text); {tag tid og beregn} dtstart:= StrToTime('00:00:00'); {midnat} Starttid:= Now - dtstart; {starttid=tid fra midnat til nu} edit3.text:=inttostr(fibr(x)); {kald fibonacci, skriv resultat} sluttid:= Now - dtstart; {sluttid=tid fra midnat til nu} {udskriv beregning og tider} DecodeTime( Starttid, Hour1, Min1, Sec1, MSec1); start_abs:=msec1+1000*sec1+1000*60*min1+1000*3600*hour1; {starttid i msec} edit8.text:=inttostr(start_abs); DecodeTime( Sluttid, Hour2, Min2, Sec2, MSec2 ); slut_abs:=msec2+1000*sec2+1000*60*min2+1000*3600*hour2; {sluttid i msec} edit9.text:=inttostr(slut_abs); edit10.text:=inttostr(slut_abs-start_abs); {regnetid i msec} Det nye er tidspunktet Now, tids-omsætningsfunktionen StrToTime og standardfunktionen DecodeTime, der opdeler et klokkeslæt i timer, minutter, sekunder og millisekunder. Til højre ses hvad hjælpeteksten skriver om standardfunktionen DecodeTime. Fidusen er altså, at et klokkeslæt omsættes fra den form, som variablen Time har (typen TDataTime), til timer, minutter, sekunder og millisekunder. I vores klik-procedure indgår tre sådanne variable, dtstart, starttid og sluttid. dtstart får sin værdi ved omsætningen dtstart:= StrToTime('00:00:00') og starttid og sluttid ved at aflæse forskellen på det aktuelle tidspunkt (i standardvariablen Now) og tidspunktet dtstart. Vi måler altså tiden fra midnat til lige før fibonacci-bergningen, og tiden fra midnat til lige efter fibonacci-beregningen. 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 8

Bagefter omsættes de to tider til timer, minutter, sekunder og millisekunder, og tiden fra midnat omregnes til et samlet antal millisekunder i linjerne start_abs:=msec1+1000*sec1+1000*60*min1+1000*3600*hour1; {starttid i msec} slut_abs:=msec2+1000*sec2+1000*60*min2+1000*3600*hour2; {sluttid i msec} Herefter kan beregningstiden findes som forskellen på de to tider. I stedet for heltal af typen Integer bruges heltal af typerne Word og Longint. Typen Word, fordi den indgår i DecodeTime-proceduren, typen Longint fordi Integer simpelt hen ikke er store nok. Talområderne for de tre slags heltal er Integer 32768..32767 Word 0..65535 Longint 2147483648..2147483647 Man kan uden videre lade word-typer indgå på højresiden af bergeninger, hvis resultat skal være af typen Longint. Se fx programlinjerne med beregningerne af start_abs og slut abs. Programmet kan fx præsenteres således: Her følger resultatet af beregningerne for n=32 til n=45, udført på en 500MHz PentiumIII-maskine: n tid / msec t n / t n-1 32 110 33 220 2,000000 34 380 2,000000 35 600 1,727273 36 930 1,578947 37 1540 1,550000 38 2470 1,655914 39 4010 1,603896 40 6480 1,623482 41 10490 1,615960 42 16970 1,618827 43 27470 1,617731 44 44430 1,618739 45 72010 1,617401 46 116500 1,620752 tid / msec tidsforbrug rekursiv fibonacci 1E6 1E5 1E4 1E3 1E2 32 34 36 38 40 42 44 46 48 50 n Opgave 13 Hvad viser grafen om beregningstiden ved den rekursive metode? 3g Dl 4.12.00 / PH Procedurer og funktioner Iteration og rekursion Side 9