Programowanie funkcyjne, II UWr, 2014/15
Lista zadań nr 9
Część I (na 20.01.2015 i 27.01.2015)

Zadanie 1 (0p.)

Zapoznaj się ze środowiskiem Dr Racket. Przeczytaj wprowadzenie, przejrzyj rozdziały 1-4 przewodnika.

Zadanie 2 (2p.)

Napisz procedurę count-change obliczającą liczbę sposobów rozmieniania danej kwoty na monety. Procedura bierze jako argument kwotę (nieujemną liczbę całkowitą) oraz listę nominałów monet (listę liczb całkowitych). Przykładowo, wartością wyrażenia
(count-change 100 '(1 5 10 25 50))
powinno być 292.

Zadanie 3 (2p.)

Napisz procedurę, która dla zadanej listy zlicza liczbę atomów na tej liście. Elementami listy mogą być liczby, symbole, napisy, wartości logiczne oraz pary (w tym listy). Atomami nazywamy wszystkie obiekty, które nie są parami.
Część II (na 03.02.2015)

Zadanie 4 (6p.)

Ruchoma konstrukcja składa się z dwóch ramion (prawego i lewego). Każde ramię ma określoną długość, a na jego końcu zawieszony jest ciężarek lub inna ruchoma konstrukcja. Konstrukcje tego typu reprezentujemy za pomocą par:
		      (define (mk-mobile left right) (cons left right))
		      (define (mk-branch length struct) (cons length struct))
		    
Ciężarek reprezentujemy jako liczbę, która określa jego wagę.
  • Napisz selektory left-branch,right-branch dla konstrukcji (zwracające odp. lewe i prawe ramię), oraz branch-length, branch-struct dla ramienia (zwracające odp. długość ramienia i strukturę/ciężar zawieszony na jego końcu).
  • Używając selektorów napisz procedurę obliczającą całkowitą wagę konstrukcji, a także procedurę sprawdzającą, czy konstrukcja jest zbalansowana. Konstrukcja jest zbalansowana, gdy iloczyn długości ramienia i ciężaru na nim zawieszonego jest taki sam dla obu ramion, oraz gdy każda z podkonstrukcji wiszących na ramionach jest również zbalansowana.
  • Napisz procedurę rysującą zadaną konstrukcję, korzystając z bibliotek Racketa.

Zadanie 5 (6p.)

Napisz procedurę deriv wykonującą symboliczne różniczkowanie wyrażeń algebraicznych, dla której argumentami są: wyrażenie algebraiczne zbudowane ze zmiennych i stałych liczbowych za pomocą dodawania i mnożenia, oraz zmienna, względem której należy liczyć pochodną. Przykładowo, procedura mogłaby dawać takie wyniki:
		      > (deriv '(* x y) 'x)
		      y
		      > (deriv '(* (* x y) (+ x 3)) 'x)
		      (+ (* x y) (* y (+ x 3)))
		    
Jak widać z drugiego przykładu, należy zadbać o upraszczanie otrzymanych przez różniczkowanie wyrażeń.