Datalogi, grundkurs 1 Övningsuppgifter i Scheme. Serafim Dahl, Carina Edlund, m.fl.

Relevanta dokument
Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Idag: Dataabstraktion

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Föreläsning 9 Exempel

Föreläsning 9 Exempel. Intervallhalveringsmetoden. Intervallhalveringsmetoden... Intervallhalveringsmetoden...

Datalogi, grundkurs 1

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Datalogi, grundkurs 1. Lösningsförslag till tentamen

TDDC74 Lab 04 Muterbara strukturer, omgivningar

TDDC74 Programmering, abstraktion och modellering DUGGA 2

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

TDDC74 Lab 02 Listor, sammansatta strukturer

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Datalogi, grundkurs 1

Dagens föreläsning Programmering i Lisp Fö 5

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

Idag: Dataabstraktion

TDDC74 Programmering, abstraktion och modellering. Tentamen

Datalogi, grundkurs 1

Våra enkla funktioner eller procedurer

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

DD1361 Programmeringsparadigm. Carina Edlund

TDDC74 Programmering: Abstraktion och modellering Dugga 2, Tid: kl 08-10, Datum:

TDDC74 Programmering: Abstraktion och modellering. Provkod TEN1, Tid: kl 14-18, , Kåra

I dag: Blockstruktur, omgivningar, problemlösning

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

TDDC74 Programmering, abstraktion och modellering DUGGA 1

TDDC74 - Lektionsmaterial C

TDDC74 Programmering, abstraktion och modellering. Tentamen

Förra gången: Primitiva data

Lösningsanvisningar till de icke obligatoriska workoutuppgifterna

TDDC74 Programmering, abstraktion och modellering. Tentamen

Lösningsförslag. TDDC74 Programmering: Abstraktion och modellering. Dugga 3 (provkod TEN1), Tid: kl 14-16, Datum:

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

a = a a a a a a ± ± ± ±500

TDDC74 Programmering, abstraktion och modellering. Tentamen

Lära dig analysera större och mer komplicerade problem och formulera lösningar innan du implementerar.

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

1, 2, 3, 4, 5, 6,...

TDDC74 Programmering: Abstraktion och modellering Datortenta

Tentamen i. TDDA 69 Data och programstrukturer

Rekursiva algoritmer sortering sökning mönstermatchning

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

Logik och Jämförelser. Styrsatser: Villkorssatsen if och repetitonssatsen for. Scriptfiler. Kommentarer. Tillämpningar: Ett enkelt filter.

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 08-12

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Lösandet av ekvationer utgör ett centralt område inom matematiken, kanske främst den tillämpade.

LÖSNINGSFÖRSLAG TILL TENTAMEN 2 SF1664

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

TDDC74 Programmering, abstraktion och modellering DUGGA 3

FÖRELÄSNING 1 PERSONAL TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017 SYFTE EXAMINATION ORGANISATION

MMA132: Laboration 2 Matriser i MATLAB

Datalogi, grundkurs 1. Lösningsförslag till tentamen

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 3 mars 2016

f (a) sin

Resträkning och ekvationer

Del I: Lösningsförslag till Numerisk analys,

Symbolisk data. quote. (define a 1) (define b 2) (jacek johan david) (list a b)

f(x + h) f(x) h f(x) f(x h) h

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Inlämningsuppgift MiniPlotter

Flervariabelanalys och Matlab Kapitel 3

Funktionell programmering DD1361

Lennart Carleson. KTH och Uppsala universitet

Modul 4 Tillämpningar av derivata

Övningshäfte 2: Induktion och rekursion

Teorifrågor. 6. Beräkna konditionstalet för en diagonalmatris med diagonalelementen 2/k, k = 1,2,...,20.

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Prov 1 2. Ellips 12 Numeriska och algebraiska metoder lösningar till övningsproven uppdaterad a) i) Nollställen för polynomet 2x 2 3x 1:

Matematisk analys för ingenjörer Matlabövning 2 Numerisk ekvationslösning och integration

TAIU07 Matematiska beräkningar med Matlab

Sökning och sortering

Repetition i Pascal. Exemplen fac. Exemplen fac i Pascal. Exemplen fac motivering. Orginalet

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Ansvariga lärare: Yury Shestopalov, rum 3A313, tel (a) Problem 1. Använd Eulers metod II (tre steg) och lös begynnelsevärdesproblemet

Lösningsanvisningar till de icke obligatoriska workoutuppgifterna

SF1661 Perspektiv på matematik Tentamen 24 oktober 2013 kl Svar och lösningsförslag. z 11. w 3. Lösning. De Moivres formel ger att

Programmeringsteknik med C och Matlab

TATM79: Föreläsning 1 Notation, ekvationer, polynom och summor

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

En vanlig uppgift är att bestämma max resp min för en trigonometrisk funktion och de x- värden för vilka dessa antas.

Lösningsförslag Tentamen i Beräkningsvetenskap I, 5.0 hp,

Programmering II (ID1019)

Tentamen i Grundläggande Programvaruutveckling, TDA548

Transkript:

Datalogi, grundkurs 1 Övningsuppgifter i Scheme Serafim Dahl, Carina Edlund, m.fl. Hösten 2004

Datalogi, grundkurs 1, hösten 2002 1 1. Vad blir det för resultat vid beräkningen av följande Scheme-uttryck. a. (- 10 (- 8 (- 6 4))) b. (/ 40 (* 5 20)) c. (/ 2 3) d. (+ (* 0.1 20) (/ 4-3)) 2. Översätt följande aritmetiska uttryck till Scheme-uttryck. a. (4 7) (13 + 5) b. (3 (4 + ( 5 3))) c. (2.5 (5 (1 10))) d. 5 ((537 (98.3 + (375 (2.5 153)))) + 255) 3. Översätt följande Scheme-uttryck till det vanliga skrivsättet som används t.ex i matematik. a. (+ 10 (+ 2.3 4.5)) b. (+ 10 (- (+ 2.3 4.5) 10)) c. (+ (* 10 2.3) (* 4.5 2.3)) d. (/ (- 10 2.3) (- 10 4.5)) 4. Nedan finns en sekvens av uttryck. Vad kommer guile att skriva som svar på inmatning av dessa uttryck? Antag att de matas in i den ordning de står. a. 10 b. (+ 5 3 4) c. (- 9 1) d. (/ 6 2) e. (+ (* 2 4) (- 4 6)) f. (define a 3) g. (define b (+ a 1)) h. (+ a b (* a b)) i. (= a b) j. (if (and (> b a) (< b (* a b))) b a) k. (cond ((= a 4) 6) ((= b 4) (+ 6 7 a)) (else 25)) l. (+ 2 (if (> b a) b a))

2 Övningsuppgifter scheme m. (* (cond ((> a b) a) ((< a b) b) (else -1)) (+ a 1)) 5. Översätt följande uttryck till scheme 5 + 4 + ( 2 ( 3 ( 6 + 4 ))) 5 3 (6 2) (2 7) 6. Definiera en procedur som tar tre tal som argument och returnerar summan av kvadraten av de två största av talen. >(maxsqsum 1 2 3) 13 7. Definiera en procedur som beräknar ytan av en ellips area(a, b) = π a b med a och b som argument. Visa beräkningsstegen för uttrycket >(area 3 4) 8. Definiera en procedur volume(a, b, h) = h area(a, b) som beräknar volymen av en elliptisk cylinder med radierna a och b samt höjden h som argument. area(a, b) är proceduren definierad i föregående uppgift. Visa beräkningsstegen för uttrycket >(volume 3 4 5) 9. Märk att beräkningsmodellen i Scheme tillåter kombinationer vars operatorer är sammansatta uttryck. Använd denna observation för att beskriva hur följande procedur fungerar: (define a-plus-abs-b (lambda (a b) ((if (> b 0) + -) a b))) 10. Om man definierat (define succ (lambda (x) (+ x 1))) (define pred (lambda (x) (- x 1))) kan man implementera + på många sätt. Illustrera för båda definitionerna nedan av plus beräkningen av följande uttryck, med hjälp av substitutionsmetoden.

Datalogi, grundkurs 1, hösten 2002 3 >(plus 3 2) >(plus 2 3) a. (define plus (lambda (a b) (if (= a 0) b (succ (plus (pred a) b))))) b. (define plus (lambda (a b) (if (= a 0) b (plus (pred a) (succ b))))) c. Vilken är svansrekursiv? Motivera! 11. Implementera den rekursiva funktionen nedan i Scheme. 0 om n = 0 2 om n = 1 f(n) = 37 om n = 2 f(n 3) + 1 om n är udda f(n/2 1) + 7 annars a. Visa med hjälp av substitutioner hur beräkningen av din implementation sker då anropet är: >(f 17) b. Är din lösning svansrekursiv eller ej? Motivera! 12. De naturliga talen kan delas i udda och jämna tal. En rekursiv beskrivning kan vara jämnt om n = 0 f(n) = udda om n = 1 f(n 2) annars Ur den beskrivningen kan man finna mönster för att implementera egna versioner av even?, som kollar om ett tal är jämnt och odd?, som kollar om ett tal är udda. a. Implementera even? med hjälp av pred. b. Implementera odd? med hjälp av pred c. Implementera odd? med hjälp av even? Det kan göras på två olika sätt finn och implementera båda.

4 Övningsuppgifter scheme 13. Om man definierar (define succ (lambda (x) (+ x 1))) (define pred (lambda (x) (- x 1))) kan man implementera +, *, ^, fac, min och max med hjälp av succ, pred och varandra. Gör detta för de naturliga talen (så att procedurerna fungerar för endast 0 och de positiva heltalen). Algoritmer som kan vara till hjälp är bland annat: { 0 om y = 0 mul(x, y) = plus(x, mul(x, pred(y))) annars x om y = 0 cut off(x, y) = 0 om x = 0 cut off(pred(x), pred(y)))) annars { 1 om n = 0 power(b, n) = mul(b, power(b, pred(n))) annars Visa samtidigt hur interpretatorn hanterar subrutinanrop och rekursion. a. Skriv * med hjälp av lösningen till föregående uppgift (med plus) b. Skriv fakultetsberäkning med hjälp av de redan implementerade procedurerna. c. Skriv s.k. cut-off -subtraktion, d.v.s. så att man får noll för resultat som skulle gett negativt resultat om alla heltal varit tillåtna. d. Skriv min som ger det minsta av sina två argument till resultat, med hjälp av cut-off -subtraktionsproceduren. e. Skriv max som ger det största av sina två argument till resultat, med hjälp av cut-off -subtraktionsproceduren. f. skriv power ( upphöjt till ). 14. Antag att du låter guile utföra beräkningen av (list 1 (list 2 (list 3 4))) Visa vad guile-interpretatorn kommer att svara och ge motsvarande box-ochpekar-diagram.

Datalogi, grundkurs 1, hösten 2002 5 15. Antag följande definitioner: (define x (list 1 2 3)) (define y (list 4 5 6)) Vad kommer guile svara då följande uttryck beräknas? a. (append x y) b. (cons x y) c. (list x y) Rita även motsvarande box-och-pekar-diagram. 16. Det är vanligt att man behöver utföra samma beräkning på alla element i en lista och tillverka en ny lista av alla svaren. Byt alla?? mot uttryck så att proceduren nedan kan användas för att, då den anropas med en lista, återsända en lista vars element är kvadraten på elementen i den medsända listan. (define square-list (lambda (a-list) (if???? (cons (square?? ) (square-list?? ))))) 17. Definiera en procedur last-pair som returnerar en lista som innehåller bara ett enda element, nämligen det sista elementet av en given (ej tom) lista: >(last-pair (list 23 72 149 34)) (34) 18. I ett försök att skriva squarelist svansrekursivt har följande procedur kommit till världen: (define square-list (lambda (x) (define iter (lambda (list answer) (if (null? list) answer (iter (cdr list) (cons (square (car list)) answer))))) (iter x ()))) Den fungerar inte så bra eftersom resultatet kommer reverserat jämfört med vad man väntar sig. Förklara varför. I ett försök att rätta till saken införs i stället följande

6 Övningsuppgifter scheme (define square-list (lambda (x) (define iter (lambda (list answer) (if (null? list) answer (iter (cdr list) (cons answer (square (car list))))))) (iter x ()))) Det fungerar inte heller något vidare. Förklara varför. 19. Definiera en procedur som beräknar medelvärdet av alla tal i en lista med bara tal. >(mean (list 1 2 3)) 2 20. Definiera en procedur som beräknar det minsta talet av talen i en lista med bara tal. >(minimum (list 1 2 3)) 1 21. Definiera en procedur filter som tar två argument varav den ena är ett predikat och den andra är en lista. Proceduren filter filtrera ut de elementen i listan för vilka predikatet ger värdet \#t. >(filter odd? (list 1 2 3 4)) (1 3) 22. reverse vänder på en lista men inte på de listor som är element i listan (om det finns). Sålunda kommer resultatet av (reverse ((1 2) (3 4))) att bli ((3 4) (1 2)) Skriv proceduren deep-reverse som vänder på alla listor på alla nivåer, så att (deep-reverse ((1 2) (3 4))) blir ((4 3) (2 1))

Datalogi, grundkurs 1, hösten 2002 7 23. Två listor anses lika om de innehåller samma element ordnade på samma sätt då de jämförs med equal?. Därför får man guile>(equal? (this is a list) (this is a list)) #t guile>(equal? (this is a list) (this (is a) list)) #f Definiera myequal? som en procedur så att a och b är lika enligt equal? om de båda är symboler och lika enligt eq? eller de båda är listor och (car a) är equal? med (car b) och (cdr a) är equal? med (cdr b). 24. Ingen version av make-rat som givits på föreläsning eller i boken är riktigt korrekt. Om man ska normalisera ett rationellt tal bör numeratorn vara det som bär på det rationella talets tecken, men ingenstans har man tagit hänsyn till tecken över huvud taget. Det är till och med så att den gcd-algoritm som givits i boken bara fungerar med positiva heltal. Den som finns inbyggd i guile däremot fungerar korrekt. Definiera om make-rat så att de rationella talen normaliseras korrekt oavsett gcd-version. 25. Om man vill representera punkter i planet kan detta göras med par av tal medan linjer i planet enklast representeras med par av punkter. a. Skriv konstruktorer och selektorer för att representera punkter i planet. b. Skriv konstruktorer och selektorer för att representera linjer i planet. c. Skriv med hjälp av de ovan nämnda konstruktorerna och selektorerna en procedur som återsänder mittpunkten på en linje. 26. I boken använder man talintervall som ett sätt att hantera osäkerhet, om än lite luddigt förklarat. Det man är ute efter är att man i många fall inte kan bestämma ett värde exakt, utan måste nöja sig med ett ungefärligt värde. Trots detta kan man vara tvungen att försöka använda det funna (ungefärliga) värdet på ett meningsfullt sätt. Man kan då antingen ge ett intervall, t ex [5..7], eller ett nominellt värde och en felgräns, t ex 6±1. Man får då speciella regler för hur man ska räkna med sådana ungefärliga värden. Här nedan återges några av verbatimmen i boken med viss modifiering: (define int-add (lambda (x y) (make-interval (+ (lower-bound x) (lower-bound y)) (+ (upper-bound x) (upper-bound y))))) (define center-width (lambda (c w) (make-interval (- c w) (+ c w))))

8 Övningsuppgifter scheme (define center (lambda (i) (/ (+ (lower-bound i) (upper-bound i)) 2))) (define width (lambda (i) (/ (- (upper-bound i) (lower-bound i)) 2))) (define int-div (lambda (x y) (make-intervall (/ (lower-bound x) (upper-bound y)) (/ (upper-bound x) (lower-bound y))))) (define int-mul (lambda (x y) (let ((p1 (* (lower-bound x) (lower-bound y))) (p2 (* (lower-bound x) (upper-bound y))) (p3 (* (upper-bound x) (lower-bound y))) (p4 (* (upper-bound x) (upper-bound y)))) (make-interval (min p1 p2 p3 p4) (max p1 p2 p3 p4))))) (define int-div-2 (lambda (x y) (int-mul x (make-interval (/ 1 (upper-bound y)) (/ 1 (lower-bound y)))))) a. Skriv de i verbatimmen använda konstruktorerna och selektorerna för intervallen (make-int, lower-bound och upper-bound). b. Skriv en procedur som subtraherar två intervall. c. Visa att vidden (avståndet mellan undre och övre gränserna) för summan av resp. differensen mellan två intervall endast beror av vidden på operanderna (de två intervall man ska operera på) och ge exempel på att det int är fallet för multiplikation resp. division. d. Den föreslagna divisionsoperatorn fungerar inte så bra om dividenden (det man dividerar med) är ett intervall som spänner över noll (vars undre gräns är negativ medan övre gränsen är positiv). Skriv om divisionsprocedurerna så att de varnar om det är så (och inte utför operationen). 27. Trapetsregeln används i boken som ett exempel på hur summationsformeln kan användas för att utföra integralberäkningar:

Datalogi, grundkurs 1, hösten 2002 9 y f(x) A a dx b x Namnet trapetsregeln kommer sig av att man kan betrakta varje parallelltrapets i figuren för sig och räkna ut ytan som begränsas av funktionen och x-axeln från x = a till x = b som summan av alla parallelltrapetserna. A = b a f(x) dx vilket i sin tur kan approximeras som A n a i, n i=1 [ ( f a + dx ) ( + f a + 3dx ) ( + + f b dx )] dx 2 2 2 och beräknas med schemeproceduren (define integral (lambda (f a b dx) (define +dx (lambda (x) (+ x dx))) (* (sum (+ a (/ dx 2)) (- b (/ dx 2)) f +dx) dx))) Simpsons formel är en noggrannare formel för numerisk integrering än trapetsregeln. Enligt Simpsons formel är integralen, A, för en funktion f i intervallet [a, b] ungefär h 3 (y 0 + 4y 1 + 2y 2 + 4y 3 + 2y 4 + + 2y n 2 + 4y n 1 + y n ) där h = (b a)/n för något jämnt heltal n och y k = f(a + k h). Noggrannheten ökar ju större n är. Definiera en procedur simpson, som tar fyra

10 Övningsuppgifter scheme argument, f, a, b och n och vars värde är ungefär lika med f, approximerad med hjälp av n enligt Simpsons formel. Testa med att beräkna b a 0 n = 100 och n = 1000. Skriv in proceduren integral, som den givits på föreläsning, gör motsvarande test och jämför med resultaten från simpson. 1 x 3 för 28. Proceduren sum är bara en av de enklaste av en mängd liknande abstraktioner (generaliseringar) som kan definieras som högre ordningens procedurer. a. Skriv en analog procedur product som returnerar produkten av alla funktionsvärden (för en given funktion) i punkter i ett intervall. Visa hur man kan definiera fact (factorial) i termer av product. b. Visa också hur man använder product för att beräkna π enligt formeln π 4 = 2 4 4 6 6 8 3 3 5 5 7 7 29. Både sum och product är specialfall av en ännu mer generell abstraktion som vi kan kalla accumulate, som kombinerar en mängd termer genom att använda någon sorts ackumuleringsfunktion. (accumulate combiner null-value term a next b) Accumulate tar som argument samma term och intervallspecifikation som sum och product. Dessutom tar accumulate en combiner-procedur, som specificerar hur en term skall kombineras med redan ackumulerat resultat och ett null-värde som specificerar vilket värde som ska användas då serien av termer tar slut. Skriv accumulate och visa hur både sum och product kan definieras som enkla anrop till accumulate 30. Definiera en procedur cubic som tar tre argument och genererar en funktion för att beräkna värdet av ett tredjegradspolynom. D v s att (define f (cubic a b c)) ska generera en procedur som representerar f(x) = x 3 +ax 2 +bx+c. Testa cubic genom att använda den tillsammans med intervallhalvering 1 och med Newton-Raphsons metod enligt föreläsning eller AS. 31. Om f är en funktion och n är ett positivt heltal kan man generera den n-te repeterade applikationen av f som definieras som den funktion vars värde i punkten x är 1 som ju är svansrekursiv enligt guile f(f(... (f(x))...)) }{{} n anrop

Datalogi, grundkurs 1, hösten 2002 11 så att om f(x) = x+1 så är ((repeated f 3) 1) 4. Skriv repeated och visa vad som händer då (define g (repeated f 3)) används. 32. Funktioner för att utjämna (eng. smoothe) är viktiga i signalhanteringssammanhang för att ta bort störningar i signaler som enligt erfarenhet skall ha ett lugnt förlopp. Om f är en funktion och dx är något (litet) tal, så kan den utjämnade versionen av f vara antingen medeltalet av f(x dx) och f(x) eller medeltalet av f(x dx), f(x) och f(x + dx). Skriv smoothe som tar en funktion som argument och returnerar den utjämnade versionen av funktionen. Se till att den fungerar tillsammans med repeated så att g blir den n-te utjämnade versionen av f genom anropet (define g (repeated (smoothe f) n)). 33. Implementera createstack, push, retrieve och pop för att manipulera en stack. 34. Kan man förena retrieve och pop i en procedur? Motivera! 35. Skriv en procedur som tar ett argument, och avgör om det är en lista. Lösningen får inte använda sig av proceduren list? (som gör samma sak), men den kan med fördel använda sig av pair? (som avgör om dess argument är ett par). 36. Skriv en procedur som tar ut det näst största talet ur en lista med heltal. Om ett näst största tal inte finns skall proceduren returnera falskt. 37. Proceduren map tar som argument en procedur och en lista, och returnerar en lista vilkas element har skapats genom att applicera den givna proceduren på varje element i den givna listan. Nedan följer ett exempel på hur map kan fungera. (define double (lambda (n) (* n 2))) > (map double (list 1 2 3)) (2 4 6) > (map odd? (list 1 2 3)) (#t #f #t) Skriv proceduren deep-map som även applicerar den givna proceduren på listor i listor. deep-map skall kunna användas på följande sätt. (define double (lambda (n) (* n 2))) > (deep-map double (list 1 2 3)) (2 4 6) > (deep-map double (1 ((2 (3)) 4))) (2 ((4 (6)) 8))

12 Övningsuppgifter scheme 38. Skriv en procedur polynom som tar en lista som argument. Den givna listan skall innehålla koefficienter för ett polynom. polynom skall returnera en procedur som beräknar polynomet med de givna koefficienterna. Anropet (polynom (list 1 2 3)) skall alltså returnera en procedur som givet x beräknar 1 + 2x + 3x 2. Nedan följer ett exempel. (define p (polynom (list 2 4 5))) > (p 2) 30 39. Skriv en procedur make-safe som kan anropas på följande sätt: (make-safe func demands) där func är en procedur, och demands är en lista med krav som argumenten till func måste uppfylla. Första platsen i demands innehåller ett predikat (en procedur som returnerar sant eller falskt) som måste vara sant för det första argumentet till func, andra platsen innehåller ett predikat som måste vara sant för det andra argumentet till func, och så vidare. Längden av demands måste alltså vara lika med antalet argument som func tar. make-safe ska returnera en procedur som kontrollerar att alla kraven i demands är uppfyllda. Om kraven är uppfyllda skall den nya proceduren returnera värdet av func; om något av kraven inte är uppfyllt returneras ett felmeddelande. Nedan följer ett exempel på hur make-safe kan användas för att skapa ett säkert plus som tar två argument. (define safe-add (make-safe + (list number? number?))) > (safe-add 1 2) 3 > (safe-add a 2) "error" Tips: För att lösa denna uppgift måste man använda sig av proceduren apply, som tar en procedur och en lista med argument, och applicerar proceduren på argumenten. > (apply + (list 1 2)) 3

Datalogi, grundkurs 1, hösten 2002 13 40. a. Skriv en procedur som tar en array med heltal och returnerar det minsta talet i arrayen. b. Skriv en procedur som tar en array med heltal och returnerar det näst minsta talet i arrayen.