Упражнение, СИ, 24.10
План:
- Функции от по-висок ред
Задача 0: Разгледайте следните дефиниции. Какво е общото между тях? Как да избегнем повторението?
(define (sum-integers a b) (if (> a b) 0 (+ a (sum-integers (+ a 1) b)))) (define (sum-cubes a b) (if (> a b) 0 (+ (cube a) (sum-cubes (+ a 1) b)))) (define (sum-e a b) (if (> a b) 0 (+ (/ 1 (fact a)) (sum-e (+ a 1) b))))
Задача 1: Напишете функция от по-висок ред (sum term a next b), която улавя общото от трите дефиниции и параметризира специфичното.
Задача 2: Използвайки sum, имплементирайте следните функции:
- (sum-of-cubes n) - сумата от кубовете на числата от 1 до n
- (sum-of-integers n) - сумата на числата от 1 до n
- (approx-e n) - n-тата частична сума на числовия ред \( \sum_{n=0}^ \infty \frac{1}{n!} \)
Задача 3: Чрез sum дефинирайте функция (integral f a b), която пресмята определения интеграл \( \int_{a}^{b}{f(x)dx} \), като използва Римановата сума \( \Delta \cdot \sum_{k=0}^{n}{f(a + \frac{(2k+1)\Delta}{2})} \), където \( \Delta \rightarrow 0, n = \frac{b-a}{\Delta} - 1 \).
Задача 4: Дефинирайте итеративен вариант на функцията sum.
(define (sum term a next b) (define (iter a result) (if <??> <??> (iter <??> <??>))) (iter <??> <??>))
Задача 5: Дефинирайте функция product, която е аналог на sum и прави точно това, което очаквате.
Задача 6: Покажете, как sum и product могат да бъдат изразени чрез по-общата функция (accumulate combiner null-value term a next b). Имплементирайте accumulate. С нейна помощ имплементирайте (fact n).
Задача 7: Функцията accumulate също може да се обобщи, т.че да натрупва само стойности, които отговарят на дадено условие. Дефинирайте функция (filtered-accumulate combiner null-value pred term a next b), която акумулира само тези стойности, които удовлетворяват предиката pred. Използвайте filtered-accumulate, за да имплементирате функциите:
- (sum-of-prime-squares n), пресмятаща сумата от квадратите на простите числа, ненадвишаващи n
- (double-fact n), пресмятаща n!!, където n!! е произведението на числата от 1 до n, които имат еднаква четност с n
Задача 8: Като използвате, че \( f'(x_0) = lim_{ \Delta \rightarrow 0 } \frac{f(x_0 + \Delta) - f(x_0)}{\Delta} \), дефинирайте функцията (derivative f), която приема функция на една променлива f и връща друга функция - нейната производна f'.
(define (cube x) (* x x x)) (define f (derivative cube)) ; f should compute 3*x^2 (f 1) ; => 3.000000248221113 (f 2) ; => 12.000000992884452 (f 3) ; => 27.000002233990017
Задача 9: Напишете функция (constantly c), която връща константната функция \( f(x) = c \).
(define forever-21 (constantly 21)) (forever-21 21) ; => 21 (forever-21 29) ; => 21 (forever-21 52) ; => 21
Задача 10: Напишете функция (flip f), която разменя аргументите на двуместна функция f.
(define cons^ (flip cons)) (cons^ 2 3) ; => (3 . 2)
Задача 11: Напишете функция (curry-3 f), която връща curried вариант на триместна функция f.
(define +' (curry-3 +)) (((+' 1) 2) 3) ; => 6
Задача 12: Напишете функция (compose f g), която връща функцията \( f \circ g \).
(define f (compose inc square)) ; x^2 + 1 (f 4) ; => 17 (f 7) ; => 50
Задача 13: Напишете функция (complement p), която приема предикат и връща неговото отрицание.
(define (less-than-5? x) (< x 5)) (define f (complement less-than-5?)) (f 3) ; => #f (f 5) ; => #t (f 7) ; => #t
Задача 14: Напишете функция (iterate n f), която повдига функцията f на n-та степен. Пример: \( f^0(x) = x \); \( f^3(x) = f(f(f(x))) \); Чрез нея дефинирайте (nth-derivative n f), пресмятаща n-тата производна на f.
(define plus-10 (iterate 10 inc)) (plus-10 1) ; => 11 (plus-10 25) ; => 35 (define pow-8 (iterate 3 square)) (pow-8 1) ; => 1 (pow-8 2) ; => 256
Задача 15: Имплементирайте cons, car и cdr като функции от по-висок ред.
(define (cons' a b) (lambda (z) (z a b))) (define (car' pair) <??>) (define (cdr' pair) <??>) (define p (cons' 2 3)) (car' p) ; => 2 (cdr' p) ; => 3