План:

  • Списъци. Основни функции - listlengthnthappend
  • Функции от по-висок ред за работа със списъци - foldfiltermap
  • Функции с променлив брой аргументи (varargs)


Интерактивна сесия: REPL.it

Задача 1: Имплементирайте функцията (digit-list n), която приема число n и връща списък от цифрите му:

(digit-list 1024) ; => (1 0 2 4)

Задача 2: Имплементирайте функциите (index-of lst val) и (last-index-of lst val). За сравняване използвайте предиката (equal? val1 val2).

(index-of (list 0 1 2 3 1) 1) ; => 1
(last-index-of (list 0 1 2 3 1) 1) ; => 4


Задача 3: Имплементирайте функцията (remove lst val), която премахва всички срещания на val в списъка lst.

(remove (list 1 2 1 3 1 4) 1) ; => (2 3 4)


Задача 4: Имплементирайте функциите (distinct? lst) и (distinct lst).

(distinct? (list 1 2 3 4)) ; => #t
(distinct? (list 1 2 3 2)) ; => #f
(distinct (list 1 2 3 2)) ; => (1 2 3)


Задача 5: Имплементирайте функцията (histogram lst), която получава списък от числа и връща списък от наредени двойки <число, брой срещания> - по една за всеки различен елемент на списъка.

(histogram '(1 4 3 5 1 2 3 4 1))
; => ((1 . 3) (4 . 2) (3 . 2) (5 . 1) (2 . 1))


Задача 6: Имплементирайте функцията (range n), която връща списък с числата от 1 до n.

(range 5) ; => (0 1 2 3 4)


Задача 7: Имплементирайте функциите (take n lst) и (drop n lst).

(take 5 (range 100)) ; => (0 1 2 3 4)
(take 100 (range 3)) ; => (0 1 2)
(drop 20 (range 23)) ; => (20 21 22)
(drop 20 (range 10)) ; => ()


Задача 8: Имплементирайте функцията (sort lst), която сортира списъка lst чрез вмъкване.

(sort (list 1 9 7 4 6)) ; => (1 4 6 7 9)


Задача 9*: Имплементирайте функцията (group-by criteria lst), която групира елементите на списъка lst според резултата от функцията criteria:

(group-by even? (range 6))
; => ((#t (0 2 4)) (#f (1 3 5)))

(group-by (lambda (x) (mod x 3)) (range 6))
; => ((0 (0 3)) (1 (1 4)) (2 (2 5)))


Задача 10: Имплементирайте функцията (flatten lst), която премахва влаганията от даден списък:
(flatten '(1 2 (3 (4) 5) (((6))))) ; => (1 2 3 4 5 6)


Задача 11: Имплементирайте функцията (chunk size lst), която разделя елементите на списъка lst в групи с големина size.

(chunk 2 (range 4)) ; => ((0 1) (2 3))
(chunk 4 (range 10)) ; => ((0 1 2 3) (4 5 6 7) (8 9))


Задача 12: Имплементирайте функцията (compose . fns), която връща композицията на подадените аргументи.

(define f (compose double square inc)) ; 2 * (x + 1)^2
(f 3) ; => 32
(f 4) ; => 50


Задача 13: Имплементирайте функцията (flip fn), която обръща реда на аргументите на функцията fn незвисимо от броя им.

(define list^ (flip list))
(list^ 1 2 3) ; => (3 2 1)


Задача 14: Имплементирайте по-общ вариант на функцията (map fn . lsts), която прилага fn с аргументи поредните елемени на списъците докато някой от тях не се  изчерпа.

(map + (list 1 2 3) (list 4 5 6) (list 7 8 9)) ; => (12 15 18)
(map cons (list 1 3 5) (list 2 4 6 8 10 12)) ; => ((1 . 2) (3 . 4) (5 . 6))


Задача 15: Имплементирайте функцията (juxt . fns) (от англ. juxtaposition - съпоставяне). Резултатът от (juxt f g h ...) e функция с променлив брой аргументи, която връща списък с резултатите от прилагането на всяка една от функциите f, g, h ... въргу тези аргументи.

(define f (juxt inc dec square double)) ; (f x) = (list (inc x) (dec x) (square x) (double x))
(f 5) ; => (6 4 25 10)

(define g (juxt + *))
(g 3 4 5) ; => (12 60)


Последно модифициране: понеделник, 14 ноември 2016, 17:42