Skip to content

bmstu-ics7/functional-programming

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Функциональное программирование

Лабораторная работа 1
  1. Представить следующие списки в виде списочных ячеек:

    • '(open close halph)
    • '((TOOL) (call))
    • '((open1) (close2) (halph3))
    • '(((TOOL1) (call2)) ((sell)))
    • '((one) for all (and(me(for you))))
    • '((TOOL) (call)) ((sell)))
  2. Используя только функции CAR и CDR, написать выражения, возвращающие

    1. второй
    2. третий
    3. четвертый элементы заданного списка.
Лабораторная работа 2
  1. Что будет в результате вычисления выражений?

    • (CAADR ' ((blue cube) (red pyramid)))
    • (CDAR '((abc) (def) (ghi)))
    • (CADR ' ((abc) (def) (ghi)))
    • (CADDR ' ((abc) (def) (ghi)))
  2. Напишите результат вычисления выражений:

    • (list 'Fred 'and 'Wilma)
    • (list 'Fred ' (and Wilma))
    • (cons Nil Nil)
    • (cons T Nil)
    • (cons Nil T)
    • (list Nil)
    • (cons ' (T) Nil)
    • (list ' (one two) ' (free temp))
    • (cons 'Fred '(and Wilma))
    • (cons 'Fred '(Wilma))
    • (list Nil Nil)
    • (list T Nil)
    • (list Nil T)
    • (cons T (list Nil))
    • (list '(T) Nil)
    • (cons '(one two) '(free temp))
  3. Написать функции

    • (f arl ar2 ar3 ar4), возвращающую список: ((arl ar2) (ar3 ar4)).
    • (f arl ar2), возвращающую ((arl) (ar2)).
    • (f arl), возвращающую (((arl))).

    Представить результаты в виде списочных ячеек.

Лабораторная работа 3
  1. Составить диаграмму вычисления следующих выражений

    • (equal 3 (abs - 3))
    • (equal (+ 1 2) 3)
    • (equal (* 4 7) 21)
    • (equal (* 2 3) (+ 7 2))
    • (equal (- 7 3) (* 3 2))
    • (equal (abs (- 2 4)) 3))
  2. Написать функцию, вычисляющую гипотенузу прямоугольного треугольника по заданным катетам и составить диаграмму её вычисления.

  3. Написать функцию, вычисляющую объем параллелепипеда по 3-м его сторонам, и составить диаграмму ее вычисления.

  4. Каковы результаты вычисления следующих выражений?

    • (list 'a c)
    • (cons'a (b c))
    • (cons'a '(b c))
    • (caddy (1 2 3 4 5))
    • (cons'a'b'c)
    • (list 'a (b c))
    • (list a '(b c))
    • (list (+ 1 '(length '(1 2 3))))
  5. Написать функцию longer_then от двух списков-аргументов, которая возвращает Т, если первый аргумент имеет большую длину.

  6. Каковы результаты вычисления следующих выражений?

    • (cons 3 (list 5 6))
    • (list 3 'from 9 'lives (- 9 3))
    • (+ (length for 2 too)) (car '(21 22 23)))
    • (cdr ' (cons is short for ans))
    • (car (list one two))
    • (cons 3 '(list 5 6))
    • (car (list 'one 'two))
Лабораторная работа 4
  1. Дана функция (defun mystery (x) (list (second x) (first x))). Какие результаты вычисления следующих выражений?

    • (mystery (one two))
    • (mystery (last one two))
    • (mystery free)
    • (mystery one 'two))
  2. Написать функцию, которая переводит температуру в системе Фаренгейта температуру по Цельсию (defum f-to-c (temp)...).

Формулы: c = 5/9*(f-320); f= 9/5*c+32.0. Как бы назывался роман Р.Брэдбери "+451 по Фаренгейту" в системе по Цельсию?

  1. Что получится при вычисления каждого из выражений?

    • (list 'cons t NIL)
    • (eval (eval (list 'cons t NIL)))
    • (apply #cons '(t NIL))
    • (list 'eval NIL)
    • (eval (list 'cons t NIL))
    • (eval NIL)
    • (eval (list 'eval NIL))
  2. Написать функцию, вычисляющую катет по заданной гипотенузе и другому катету прямоугольного треугольника, и составить диаграмму ее вычисления.

  3. Написать функцию, вычисляющую площадь трапеции по ее основаниям и высоте, и составить диаграмму ее вычисления.

Лабораторная работа 5
  1. Написать функцию, которая принимает целое число и возвращает первое четное число, не меньшее аргумента.

  2. Написать функцию, которая принимает число и возвращает число того же знака, но с модулем на 1 больше модуля аргумента.

  3. Написать функцию, которая принимает два числа и возвращает список из этих чисел, расположенный по возрастанию.

  4. Написать функцию, которая принимает три числа и возвращает Т только тогда, когда первое число расположенно между вторым и третьим.

  5. Каков результат вычисления следующих выражений?

    • (and ’fee ’fie ’foe)
    • (or nil ’fie ’foe)
    • (and (equal ’abc ’abc) ’yes)
    • (or ’fee ’fie ’foe)
    • (and nil ’fie ’foe)
    • (or (equal ’abc ’abc) ’yes)
  6. Написать предикат, который принимает два числа-аргумента и возвращает Т, если первое число не меньше второго.

  7. Какой из следующих двух вариантов предиката ошибочен и почему?

(defun pred1 (x)
    (and (numberp x) (plusb x))
)

(defun pred2 (x)
    (and (plusp x) (numberp x))
)
  1. Решить задачу 4, используя для ее решения конструкции IF, COND, AND/OR.
Лабораторная работа 6

Дано два списка: первый список название стран, второй – столиц.

  • из двух списков создать список из двухэлементных списков
  • из двух списков создать список из точечных пар

По полученным спискам по стране найти столицу и наоборот.

Лабораторная работа 7
  1. Чем принципиально отличаются функции cons, lisp, append?

  2. Каковы результаты вычисления следующих выражений?

    • (reverse ())
    • (last ())
    • (reverse ’(a))
    • (last ’(a))
    • (reverse ’((a b c)))
    • (last ’((a b c)))
  3. Написать два варианта функции, которая возвращает последний элемент своего списка-аргумента.

  4. Написать два варианта функции, которая возвращает свой список-аргумент без последнего элемента.

  5. Написать простой вариант игры в кости, в котором бросаются две правильные кости. Если сумма выпавших очков равна 7 или 11 – выигрыш, если выпало (1, 1) или (6, 6) – игрок получает право снова бросить кости, во всех остальных случаях ход переходит ко второму игроку, но запоминается сумма выпавших очков. Если второй игрок не выигрывает абсолютно, то выигрывает тот игрок, у которого больше очков. Результат игры и значения выпавших костей выводить на экран с помощью функции print.

Лабораторная работа 8
  1. Написать функцию, которая по своему списку-аргументу lst определяет является ли он полиндромом (то есть равны ли lst и (reverse lst)).

  2. Напишите функцию swap-first-last, которая переставляет в списке-аргументе первый и последний элементы.

  3. Напишите функцию swap-tow-elements, которая переставляет в списке-аргументе два указанных своими порядковыми номерами элемента в этом списке.

  4. Напишите две функции, swap-to-left и swap-to-right, которые производят круговую перестановку в списке-аргументе влево и вправо, соотвественно (на k позиций).

  5. Напишите функцию, которая умножает на заданное число-аргумент все числа из заданного списка-аргумента, когда

    • все элементы списка – числа,
    • элементы списка – любые объекты.
  6. Напишите функцию, select-between, которая из списка-аргумента, содержащего только числа, выбирает только те, которые расположены между двумя указанными границами-аргументами и возращает их в виде списка (упорядоченного по возрастанию списка чисел).

Лабораторная работа 9
  1. Написать предикат set-equal, который возвращает t, если два его множества-аргумента содержат одни и те же элементы, порядок которых не имеет значения.

  2. Напишите необходимые функции, которые обрабатывают таблицу из точечных пар: (страна. столица), и возвращают по стране - столицу, а по столице - страну.

  3. Напишите функцию, которая умножает на заданное число-аргумент все числа из заданного списка-аргумента, когда

    • все элементы списка – числа,
    • элементы списка – любые объекты.
  4. Напишите функцию, которая уменьшает на 10 все числа из списка аргумента этой функции.

  5. Написать функцию, которая возвращает первый аргумент списка-аргумента. который сам является непустым списком.

  6. Написать функцию, которая выбирает из заданного списка только те числа, которые больше 1 и меньше 10. (Вариант: между двумя заданными границами.)

  7. Написать функцию, вычисляющую декартово произведение двух своих списков-аргументов.

  8. Почему так реализовано reduce, в чем причина?

(reduce #’+ ()) -> 0
Лабораторная работа 10
  1. Пусть list-of-list список, состоящий из списков. Написать функцию, которая вычисляет сумму длин всех элементов list-of-list.
  2. Написать рекурсивную версию (с именем reg-add) вычисления суммы чисел заданного списка.
  3. Написать рекурсивную версию с именем recnth функции nth.
  4. Написать рекурсивную функцию alloddr, которая возвращает t когда все элементы списка нечетные.
  5. Написать рекурсивную функцию, относящуюся к хвостовой рекурсии с одним тестом завершения, которая возвращает последний элемент списка-аргумента.
  6. Написать рекурсивную функцию, относящуюся к дополняемой рекурсии с одним тестом завершения, которая вычисляет сумму всех чисел от 0 до n-ого аргумента функции.
  7. Написать рекурсивную функцию, которая возвращает последнее нечетное число из числового списка, возможно создавая некоторые вспомогательные функции.
  8. Используя cons-дополняемую рекурсию с одним тестом завершения, написать функцию которая получает как аргумент список чисел, а возвращает список квадратов этих чисел в том же порядке.
  9. Написать функцию с именем select-odd, которая из заданного списка выбирает все нечетные числа. (Вариант 1: select-even, вариант 2: вычисляет сумму всех нечетных чисел(sum-all-odd) или сумму всех четных чисел (sum-all-even) из заданного списка.)