Datastrukturer og Algoritmer, dat C
Henning Christiansen
2/10-2002
Opgaver til forel¾sningen 1/10-2002 om
Rekursion, dynamisk programmering, m.v.
Det foreslŒs at
prioritere 1.1, 1.2, 1.4 og 3 h¿jest. Opgave 2 er velegnet som hjemmesyssel.
Opgave 1
Betragt programmet
side 271 i bogen som handler om at give byttepenge tilbage
(programtekst med
hovedprogram kan findes via link pŒ kursushjemmesiden).
- I forel¾sningen forklarede vi kun den
del af algoritmen, som handlede om at bestemme det mindste antal antal m¿nter,
som skal til for at give et vist bel¿b tilbage. Men algoritmen indeholder
faktisk ogsŒ noget ekstra, som g¿r det mulig at udskrive hvilke m¿nter der
faktisk er tale om. Men det er ikke forklaret hvordan eller hvorfor det
virker Ñ og de benyttede variabelnavne er heller ikke hj¾lpsomme. Opgaven
lyder nu: Find ud af og forklar for hinanden hvordan denne del af
algoritmen virker.
- Nu skal programmet tilpasses danske
forhold, og for nemheds skyld, regn alt i ¿rebel¿b. Inds¾t data svarende
til danske sedler og m¿nter, og tilf¿j princippet Órund-op-ned-til-n¾rmeste-25¿reÓ. ImplementŽr
og aftest programmet.
- Algoritmen synes ikke at v¾re specielt
effektiv.
- F.eks. udnytter den ikke Ñ eller
antager ikke, at m¿ntenhederne optr¾der i voksende r¾kkef¿lge i arrayet.
Er der steder i programmet, hvor man kunne optimere under den antagelse?
- En anden mulig kilde til ineffektivitet
er at algoritmen konstuerer den samme l¿sning pŒ forskellig mŒde. F.eks.
hvis der skal gives 9 kr tilbage, sŒ konstrueres den optimale l¿sning
5+2+2 ved f¿rst at pr¿ve med en 2kr-m¿nt og slŒ op i tabellen og se hvordan
man giver 7kr tilbage (5+2); men den konstrueres ogsŒ f¿rst at pr¿ve med en
5kr-m¿nt, og derefter slŒ op i tabellen og se hvordan man giver 4kr
tilbage. Vil det kunne betale sig at s¾tte noget ekstra bogholderi pŒ til
at undgŒ det? Eller vil det blot sl¿ve udregningen ned alligevel? [Det er
OK at argumentere intuitivt].
- Der findes faktisk mere optimale mŒder at
give penge tilbage pŒ end den som vor algoritme nŒr frem til. Tag bel¿bet
99kr. Vi vil forvente 50+20+20+5+2+2, dvs. 6 m¿nter. Men den kan klares
med to enheder: Òhar du en krone, fŒr du en hund af migÓ. Tilpas
algoritmen sŒ den tillader denne mŒde at give tilbage pŒ og minimerer det
totale antal m¿nter, som gives tilbage.
- Bogen omtaler en ÓgreedyÓ algoritme side
268, som nogen gange virker og nogen gange ikke virker. Vil den virke i
Danmark? Hvilke krav skal v¾re opfyldt af en m¿ntsystem for at ÓgreedyÓ
virker?
Opgave 2
Tag udgangspunkt i
programmet ÓdrawRulerÓ side 247 i bogen (programtekst med hovedprogram han
findes via link pŒ kursushjemmesiden). Det indeholder noget primitivt grafik, som
viser hvordan man definere sig en tegneplade og tegne en streg. Det er sŒdan
set det eneste vi skal bruge fra det program. Brug disse faciliteter til at l¿se
sŒ mange af f¿lgende opgaver som du gider, eller hit selv pŒ nogen, der er
sjovere:
- Skriv et program som tegner en ramme Ð
og rekursivt inde i den en ramme som er 85% mindre pŒ begge leder Ñ og
rekursivt inde i den .... . V¾r opm¾rksom pŒ, du selv mŒ hitte pŒ et
stopkriterium.
- Du har sikkert l¾st ÒrammeÓ som et
rektangel hvis sider er parallelle med tegnefladens sider. Skriv nu et
program som f¿rst tegner en ramme (i n¾vnte betydning). Dern¾st inde i den
en rombe (dvs. en firkant pŒ h¿jkant), hvis hj¿rner r¿rer ved rammens sider.
Inde i den igen en ramme hvis hj¿rner r¿rer ved rombens sider Ñ og sŒ
fremdeles. Benyt to metoder som skiftevis kalder hinanden.
- Tegn en rekursiv busk, som ca. ser ud som
et ÒYÓ med to mindre buske i grenene. I f¿rste omgang, sŒ YÕerne alle
peger opad, men pr¿v at dreje dem lidt hver gang, sŒ det ser mere
dekorativt ud.
- Bland Fibonacci-tal ind i historien og se
om du kan fŒ tegningen til at konvertere mod det gyldne snit. (Det gylde
snit kan findes som gr¾nsev¾redien for forholdet mellem to Fibonacci-tal:
1/1, 1/2, 2/3, 3/5, 5/8, 8/13, 13/21, 21/34...
Opgave
3
Betragt de fire
versioner af Fibonacci-beregnere i foresl¾sningsOHerne (via kursets
hjemmeside), og angive ÒOÓ udtryk for dem.
- Angiv ÒOÓ udtryk for dem hver is¾r, nŒr de
kaldes Žn enkelt gang med et eller anden n.
- Angive ÒOÓ udtryk for et program som ikke
laver andet end at kalde pŒ Fibonacci-metoden. Det antages, at den kaldes m gange med et argument som er begr¾nset
opadtil med n.