# Examen Januari 2023-2024

- Examen duurt 3 uur
- Opmerking: niet de exacte verwoording van de vragen, maar wel de essentie.

## Lijsten

Schrijf een functie *(zip lst1 lst2)* die twee lijsten als argumenten aanvaardt en een nieuwe lijst teruggeeft waarvan de elementen de som zijn van de overeenkomstige elementen van de twee lijsten. Je mag ervan uitgaan dat de twee lijsten even lang zijn.

```scheme
(define l1 '(1 2 3))
(define l2 '(4 5 6))

(zip l1 l2) ; ==> '(5 7 9)
```

Was je antwoord recursief of iteratief? Leg uit. Geef ook de andere versie.

Schrijf een functie *(combineer lst1 lst2 combinator)* die twee lijsten als argumenten aanvaardt en een nieuwe lijst teruggeeft waarvan de elementen de resultaten zijn van de combinator op de overeenkomstige elementen van de twee lijsten. Je mag ervan uitgaan dat de twee lijsten even lang zijn.

Schrijf een functie *(sum-squares lst1 lst2)* die een lijst van lijsten aanvaardt en een lijst teruggeeft waarvan de elementen de som van de kwadraten zijn van de overeenkomstige elementen van de lijsten in de lijst van lijsten. Maak hiervoor gebruik van de *combineer*-functie van de vorige opgave. Je mag ervan uitgaan dat de lijsten in de lijst van lijsten even lang zijn.

## Destructieve operaties

Schrijf een functie *(kap-af! lst m)* die een lijst *lst* en een getal *m* aanvaardt en de lijst *lst* wijzigt aan de hand van de volgende regels:

- als een element van de lijst een negatief getal is, dan wordt het verwijderd
- als een element van de lijst groter is dan *m*, dan wordt het vervangen door *m*

De output van de functie is niet van belang. In het voorbeeld is de output "ok", maar dit mag dus ook iets anders zijn.
Je mag geen nieuwe cons-cellen aanmaken, je moet gebruik maken van destructieve operaties. Je mag ervan uitgaan dat de lijst *lst* enkel uit getallen bestaat, en dat het eerste getal een positief getal is.

```scheme
(define l '(1 -5 10 -1 15 5))
(kap-af! l 5) ; ==> ok
l ; ==> '(1 5 5 5)
```

## Bomen

```scheme
	(define belgie 
		'(België 
			(Vlaanderen 
				(Antwerpen (Deurne Schoten ...))
				(Limburg (Hasselt ...))
			)
			(Wallonië 
				(Namen (Namen ...)) 
				(Luxemburg (Aarlen ...))
			)
			(Brussel
				(Elsene Etterbeek ...)
			)
		)
	)
```

Gegeven de boom *belgie* (inclusief schets van de boom). Schrijf een functie *(verdeel-budget tree bedrag)* die een budget verdeeld over de gemeenten. Het budget wordt gelijk verdeeld over ieder niveau, dus Vlaanderen, Wallonië en Brussel krijgen elk een gelijk deel van het budget, de provincies krijgen op hun beurt een gelijke verdeling van dat deel, enzovoort. Brussel heeft enkel gemeentes.

Voorbeeld:

```scheme
(verdeel-budget belgie 750000)
; (België 
;	(Vlaanderen
;		(Antwerpen (Deurne 724.64) (Schoten 724.64) ...)) 
;		...
;	) 
;	(Wallonië 
;		...
;	) 
;	(Brussel 
;		(Elsene 13157.89) (Etterbeek 13157.89) ...
;	)
; )
```

## Streams

Gegeven een stroom bestaande uit deelstromen, allen van dezelfde lengte. Schrijf een functie *(populairste stroom)* die de positie in de deelstroom teruggeeft, beginnend van 0, van de elementen die paarsgewijs de grootste som hebben. Voorbeeld:

|9 8 7| |6 5 4| |3 2 1|
----------------------------[populairste]---> 2

|3 2 1 0| |3 2 1 0| |3 2 1 0|
----------------------------[populairste]---> 3

Geef de verloop van de stream schematisch weer.

Schrijf de functie *populairste*.

## Omgevingsmodellen

Gegeven:

```scheme
(define a 2)
(define b 4)

(define (bar a b) (+ a b))
(define (foo bar a)
	(let*
		((a (bar a b)) (b (bar a b)))
		(display b)
	)
	(set! a 3)
	(set! b 3)
	(display a)
)
```

Teken het omgevingsmodel bij het uitvoeren van `(foo bar 1)` en `(foo bar 2)`. Geef ook de output van beide functies.

## Theorie

Leg de memoize techniek uit. Waarvoor wordt deze gebruikt.

Gegeven recursieve versie van fib. Wat gebeurt er als we de memoize techniek toepassen op fib? Is dit beter/slechter?
