-
Разработайте функции
cnst
,variable
,add
,subtract
,multiply
,divide
,negate
для вычисления выражений с одной переменной. -
Функции должны позволять производить вычисления вида:
let expr = subtract( multiply( cnst(2), variable("x") ), cnst(3) ); println(expr(5));
При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра функции
expr
(на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7. -
Тестовая программа должна вычислять выражение
x2−2x+1
, дляx
от 0 до 10. -
Требуется написать функцию
parse
, осуществляющую разбор выражений, записанных в обратной польской записи. Например, результатомparse("x x 2 - \* x \* 1 +")(5)
должно быть число
76
. -
При выполнение задания следует обратить внимание на:
- Применение функций высшего порядка.
- Выделение общего кода для бинарных операций.
-
Разработайте классы
Const
,Variable
,Add
,Subtract
,Multiply
,Divide
,Negate
для представления выражений с одной переменной.-
Пример описания выражения
2x-3
:let expr = new Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) );
-
Метод
evaluate(x)
должен производить вычисления вида: При вычислении такого выражения вместо каждой переменной подставляется значениеx
, переданное в качестве параметра функцииevaluate
(на данном этапе имена переменных игнорируются). Таким образом, результатом вычисления приведенного примера должно стать число 7. -
Метод
toString()
должен выдавать запись выражения в обратной польской записи. Например,expr.toString()
должен выдавать2 x * 3 -
.
-
-
Метод
diff("x")
должен возвращать выражение, представляющее производную исходного выражения по переменнойx
. Например,expr.diff("x")
должен возвращать выражение, эквивалентноеnew Const(2)
(выраженияnew Subtract(new Const(2), new Const(0))
иnew Subtract( new Add( new Multiply(new Const(0), new Variable("x")), new Multiply(new Const(2), new Const(1)) ) new Const(0) )
так же будут считаться правильным ответом).
Функция
parse
должна выдавать разобранное объектное выражение. -
При выполнение задания следует обратить внимание на:
- Применение инкапсуляции.
- Выделение общего кода для операций.
- Добавьте в предыдущее домашнее задание функцию
parsePrefix(string)
, разбирающую выражения, задаваемые записью вида(- (* 2 x) 3)
. Если разбираемое выражение некорректно, методparsePrefix
должен бросать человеко-читаемое сообщение об ошибке. - Добавьте в предыдущее домашнее задание метод
prefix()
, выдающий выражение в формате, ожидаемом функциейparsePrefix
. - При выполнение задания следует обратить внимание на:
- Применение инкапсуляции.
- Выделение общего кода для бинарных операций.
- Обработку ошибок.
- Минимизацию необходимой памяти.
- Разработайте функции для работы с объектами линейной алгебры, которые представляются следующим образом:
- скаляры – числа
- векторы – векторы чисел;
- матрицы – векторы векторов чисел.
- Функции над векторами:
v+
/v-
/v*
– покоординатное сложение/вычитание/умножение;scalar
/vect
– скалярное/векторное произведение;v*s
– умножение на скаляр.
- Функции над матрицами:
m+
/m-
/m*
– поэлементное сложение/вычитание/умножение;m*s
– умножение на скаляр;m*v
– умножение на вектор;m*m
– матричное умножение;transpose
– траспонирование;
- Ко всем функциям должны быть указаны контракты. Например, нельзя складывать вектора разной длины.
- Все функции должны поддерживать произвольное число аргументов. Например
(v+ [1 2] [3 4] [5 6])
должно быть равно[9 12]
. - При выполнение задания следует обратить внимание на:
- Применение функций высшего порядка.
- Выделение общего кода для операций.
-
Разработайте функции
constant
,variable
,add
,subtract
,multiply
иdivide
для представления арифметических выражений.-
Пример описания выражения
2x-3
:(def expr (subtract (multiply (constant 2) (variable "x")) (constant 3)))
-
Выражение должно быть функцией, возвращающей значение выражение при подстановке элементов, заданных отображением. Например,
(expr {"x" 2})
должно быть равно 1.
-
-
Разработайте разборщик выражений, читающий выражения в стандартной для Clojure форме. Например,
(parseFunction "(- (\* 2 x) 3)")
должно быть эквивалентно
expr
. -
Функции
add
,subtract
,multiply
иdivide
должны принимать произвольное число аргументов. Разборщик так же должен допускать произвольное число аргументов для+
,-
,*
. -
При выполнение задания следует обратить внимание на:
- Выделение общего кода для операций.
- Разработайте конструкторы
Constant
,Variable
,Add
,Subtract
,Multiply
иDivide
для представления выражений с одной переменной.-
Пример описания выражения
2x-3
:(def expr (Subtract (Multiply (Constant 2) (Variable "x")) (Const 3)))
-
Функция
(evaluate expression vars)
должна производить вычисление выраженияexpression
для значений переменных, заданных отображениемvars
. Например,(evaluate expr {"x" 2})
должно быть равно 1. -
Функция
(toString expression)
должна выдавать запись выражения в стандартной для Clojure форме. -
Функция
(parseObject "expression")
должна разбирать выражения, записанные в стандартной для Clojure форме. Например,(parseObject "(- (\* 2 x) 3)")
должно быть эквивалентно
expr
. -
Функция
(diff expression "variable")
должена возвращать выражение, представляющее производную исходного выражения по заданой пермененной. Например,(diff expression "x")
должен возвращать выражение, эквивалентное(Constant 2)
, при этом выражения(Subtract (Const 2) (Const 0))
и(Subtract (Add (Multiply (Const 0) (Variable "x")) (Multiply (Const 2) (Const 1))) (Const 0))
так же будут считаться правильным ответом.
-
- Констуркторы
Add
,Subtract
,Multiply
иDivide
должны принимать произвольное число аргументов. Разборщик так же должен допускать произвольное число аргументов для+
,-
,*
,/
. - При выполнение задания можно использовать любой способ преставления объектов.
-
Реализуйте функцию
(parseObjectInfix "expression")
, разбирающую выражения, записанные в инфиксной форме, и функциюtoStringInfix
, возвращающую строковое представление выражения в этой форме. Например,(toStringInfix (parseObjectInfix "2 \* x - 3"))
должно возвращать
((2 * x) - 3)
. -
Функции разбора должны базироваться на библиотеке комбинаторов, разработанной на лекции.
-
Разработайте правила:
prime(N)
, проверяющее, чтоN
– простое число.composite(N)
, проверяющее, чтоN
– составное число.prime_divisors(N, Divisors)
, проверяющее, что списокDivisors
содержит все простые делители числаN
, упорядоченные по возрастанию. ЕслиN
делится на простое числоP
несколько раз, тоDivisors
должен содержать соответствующее число копийP
.
-
Варианты
- Простой:
N
≤ 1000. - Сложный:
N
≤ 10^5. - Бонусный:
N
≤ 10^7.
- Простой:
-
Вы можете рассчитывать, на то, что до первого запроса будет выполнено правило
init(MAX_N)
.
-
Реализуйте ассоциативный массив (map) на основе деревьев поиска. Для решения можно реализовать любое дерево поиска логарифмической высоты.
-
Разработайте правила:
map_get(TreeMap, Key, Value)
, проверяющее, что массив содержит заданную пару ключ-значение (O(log n)).map_put(TreeMap, Key, Value, Result)
; добавляющее пару ключ-значение в массив, или заменяющее текущее значение для ключа (O(log n));map_remove(TreeMap, Key, Result)
удаляющее отображение для ключа (O(log n));map_build(ListMap, TreeMap)
, строящее дерево из неупорядоченного списка пар ключ-значение (O(n log n)).