1. Опитайте се да реализирате foldl чрез foldr.

    Упътване: резултатът от foldr не е задължително да е от същия "тип" като от елементите на списък. Например, ако l е списък от числа, то резултатът от (foldr cons '() l) не е просто едно число, а е списък от числа. Друг пример: резултатът от (foldr list '() l) не е просто едно число, а е дълбок списък от числа. За да решите тази задача, помислете как foldr да се направи така, че резултатът от него да е функция на един аргумент, на която да подадете nv. Ако не успеете да се сетите сами, потърсете информация в Интернет. Посочете недостатък на реализацията чрез foldr пред директната реализация.
  2. Да се реализира функция splitsquares, която в дълбок списък от числа заменя всички числа x , които могат да се представят като x = y2 + z2 за положителни цели числа y, z, със списъка (y z).

    Пример: (splitsquares '((1 (2)) (((3) 4) (5 (6)) () (7)) 8))) --> ((1 ((1 1))) (((3) 4) ((1 4) (6)) () (7)) (4 4)))
  3. Да се реализира функцията splitsquares с помощта на deep-foldr
  4. С помощта на deep-foldr да се реализира функцията fake-foldr, която прави дясно (недълбоко) свиване над списък от атоми.
  5. Да се реализира дълбоко ляво свиване deep-foldl: а) директно, б) чрез map и foldl, в) чрез deep-foldr.
  6. С помощта на deep-foldl да се реализира по-ефективен вариант на deep-reverse.
  7. Да се реализират функции two-to-many-l и two-to-many-r, които превръщат функция над два аргумента във функция над произволен положителен брой аргументи съответно чрез ляво и дясно свиване.

    Пример: ((two-to-many-l (lambda (x y) (+ x y))) 1 2 3 4 5) --> 15
  8. Да се реализира функцията map с произволен брой аргументи.
  9. С помощта на eval да се реализира apply с произволен брой аргументи.
  10. Да се напише функция find-gamma, която по дадена рекурсивна дефиниция на функция f връща код оператор gamma, такъв че (gamma f) = f.

    Пример: (find-gamma '(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))) --> (lambda (f) (lambda (n) (if (= n 0) 1 (* n (f (- n 1))))))
  11. С помощта на find-gamma, eval и оператора за неподвижна точка Y да се реализира функция evalrec, която по дадена рекурсивна дефиниция на функция намира самата функция, без да извиква eval над израз, съдържащ специалната форма define.

    Пример: ((evalrec '(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))) 7) --> 5040
  12. Да се разширят функциите find-gamma и evalrec, така че да работят над функции с повече от един аргумент.
  13. С помощта на eval да се направи функция unfold, която приема дефиниция на линейно-рекурсивна функция в Scheme и "развива" една стъпка от рекурсията в if. За удобство можете да приемете, че дефиницията се състои от единствен израз "if", т.е. една база и една стъпка.

    Пример: (unfold '(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))) --> (define (fact n) (if (= n 0) 1 (if (= (- n 1) 0) 1 (* n (fact (- n 1))))))
  14. Да се разшири функцията unfold, така че да работи с повече от една база и с повече от една стъпка.
  15. Да се разшири функцията unfold, така че да работи с функции с повече от един аргумент.
Last modified: Wednesday, 6 November 2019, 9:07 AM