Задание 1 по курсу ФЛП. Не забудьте подумать, как код должен себя вести в граничных условиях (например, на пустых списках). Присылайте решения на адрес alexey.v.romanov@gmail.com В subject должно быть "ФЛП" и указан номер лабораторной. Название файла, содержащего решения: номерГруппы_фамилия_lab1.erl Оформляйте код так, чтобы его было легко читать и понимать. На 3: 3 задачи На 4: задачи без звёздочек Плохо: foo(X)-> bar(X+2),Y=X, baz(Y); foo(Z) -> []. Хорошо: foo(X) -> bar(X + 2), Y = X, baz(Y); foo(Z) -> []. 1. Напишите функцию min_max, возвращающую кортеж из минимального и максимального элементов списка. min_max([6,1,4]) => {1,6} min_max([]) => ошибка 2. Напишите функцию is_palindrome, проверяющую, является ли список палиндромом (читается одинаково в обоих направлениях). Можно использовать функцию lists:reverse из стандартного модуля lists. is_palindrome([1,2,3,2,1]) => true is_palindrome([1,2,2,2]) => false 3. Напишите функцию product, возвращающую произведение всех элементов списка. product([2,2,2]) => 8. Как она себя ведёт, если в списке есть не только числа? 4. Напишите функцию all_different(X,Y,Z), возвращающую true, если все 3 аргумента неравны друг другу all_different(2,6,4) => true all_different(4,6,4) => false 5. Напишите функцию is_proper_list, проверяющую, является ли список настоящим. is_proper_list([1,2,3]) => true is_proper_list([1,2 | 3]) => false 6. Напишите функцию slice(N,M,List), возвращающую отрезок списка с N-ого по M-ый элементы. (В Erlang элементы списка нумеруются, начиная с первого.) slice(2, 4, [a,b,c,d,e,f]) => [b,c,d] 7. max(X,Y,Z) -> if X > Y andalso X > Z -> X; Y > X andalso Y > Z -> Y; true -> Z end. Эта функция должна возвращать максимальный из трёх аргументов. Правильно ли она работает? Почему? Если нет, то напишите правильный вариант. 8. Напишите функцию num_solutions(A,B,C), возвращающую число действительных решений квадратного уравнения A*x^2 + B*x + C = 0. num_solutions(1,-2,1) => 1 (у x^2 - 2*x + 1 = 0 одно решение) num_solutions(1,0,1) => 0 (у x^2 + 1 = 0 нет решений) num_solutions(1,0,-1) => 2 (у x^2 - 1 = 0 два решения) 9. Компания платит налоги по следующей схеме: 1. С первых 50000 р. прибыли налог не взимается; 2. Со следующих 20000 р. (до 70000) налог 10%; 3. С каждых следующих 20000 р. налог повышается на 10%; 4. Максимальная ставка налога -- 40%. Напишите функцию after_tax(Income), которая возвращает чистую прибыль после налога (Income -- прибыль перед налогом). after_tax(49999.0) => 49999.0 after_tax(100000.0) => 91000.0 Подумайте, что делать, если ставки налога или пороговые суммы изменятся. 10. Напишите функцию reverse, разворачивающую список reverse([1,2,3]) => [3,2,1] 11*. Напишите функцию flatten, принимающую список списков и возвращающую "сплющенный" список flatten([1,[2,3],[4,[[5]]],6]) => [1,2,3,4,5,6] 12*. Функция rle кодирует список методом повторов. Именно, если один элемент встречается несколько раз подряд, он заменяется на кортеж {Элемент, Число повторов} rle([a,a,a,b,c,c,a,a]) => [{a,3},{b,1},{c,2},{a,2}] Функция rle1 делает то же самое, но элементы без повторов оставляет сами по себе. rle1([a,a,a,b,c,c,a,a]) => [{a,3},b,{c,2},{a,2}] Какая из них полезнее и почему? 13*. Функция rld раскодирует список, закодированный функцией rle. rld([{a,3},{b,1},{c,2},{a,2}]) => [a,a,a,b,c,c,a,a] 14*. Напишите _хвосто-рекурсивную_ функцию fast_power(X, N), которая вычисляет X^N за O(log N) шагов. (Указание: введите переменную-аккумулятор. Подробнее на лекции.) 15**. Напишите функцию weekday(Day, Month, Year), возвращающую день недели по числу, месяцу и году. weekday(8, february, 2010) => monday