Приобретение навыков работы с основами программирования на языке Scheme: использование рекурсии, процедур высшего порядка, списков.
При выполнении заданий не используйте присваивание, циклы и обращение к элементам последовательности по индексу. Избегайте возврата логических значений из условных конструкций. Продемонстрируйте работоспособность процедур на примерах.
-
Реализуйте процедуру
(count x xs)
, подсчитывающую, сколько раз встречается элементx
в спискеxs
. Примеры применения процедуры:(count 'a '(a b c a)) ⇒ 2 (count 'b '(a c d)) ⇒ 0 (count 'a '()) ⇒ 0
-
Реализуйте процедуру
(delete pred? xs)
, которая "удаляет" из спискаxs
все элементы, удовлетворяющие предикатуpred?
. Примеры применения процедуры:(delete even? '(0 1 2 3)) ⇒ (1 3) (delete even? '(0 2 4 6)) ⇒ () (delete even? '(1 3 5 7)) ⇒ (1 3 5 7) (delete even? '()) ⇒ ()
-
Реализуйте процедуру
(iterate f x n)
, которая возвращает список изn
элементов вида(x, f(x), f(f(x)), f(f(f(x))), …)
, гдеf
— процедура (функция) одного аргумента. Примеры применения процедуры:(iterate (lambda (x) (* 2 x)) 1 6) ⇒ (1 2 4 8 16 32) (iterate (lambda (x) (* 2 x)) 1 1) ⇒ (1) (iterate (lambda (x) (* 2 x)) 1 0) ⇒ ()
-
Реализуйте процедуру
(intersperse e xs)
, которая возвращает список, полученный путем вставки элементае
между элементами спискаxs
. Примеры применения процедуры:(intersperse 'x '(1 2 3 4)) ⇒ (1 x 2 x 3 x 4) (intersperse 'x '(1 2)) ⇒ (1 x 2) (intersperse 'x '(1)) ⇒ (1) (intersperse 'x '()) ⇒ ()
-
Реализуйте предикаты
(any? pred? xs)
, который возвращает#t
, если хотя бы один из элементов спискаxs
удовлетворяет предуикатуpred?
, и(all? pred? xs)
, который возвращает#t
, если все элементы спискаxs
удовлетворяет предуикатуpred?
. Не используйте условные конструкции, вместо них используйте особенности встроенныхand
иor
. Примеры применения:(any? odd? '(1 3 5 7)) ⇒ #t (any? odd? '(0 1 2 3)) ⇒ #t (any? odd? '(0 2 4 6)) ⇒ #f (any? odd? '()) ⇒ #f (all? odd? '(1 3 5 7)) ⇒ #t (all? odd? '(0 1 2 3)) ⇒ #f (all? odd? '(0 2 4 6)) ⇒ #f (all? odd? '()) ⇒ #t ; Это - особенность, реализуйте её
-
Реализуйте композицию функций (процедур) одного аргумента, для чего напишите процедуру
o
, принимающую произвольное число процедур одного аргумента и возвращающую процедуру, являющуюся композицией этих процедур. Примеры применения процедуры:(define (f x) (* x 2)) (define (g x) (* x 3)) (define (h x) (- x)) ((o f g h) 1) ⇒ -6 ((o f g) 1) ⇒ 6 ((o h) 1) ⇒ -1 ((o) 1) ⇒ 1