На этом шаге мы приведем задачи для самостоятельного решения.
1. Определите прагматику функций, приведённых ниже:
(1) cdr:: [Int] -> [Int] cdr lst | null lst = lst | True = tail lst (2) doub:: [Int] -> [Int] doub lst | null lst = lst | True = head lst : lst (3) posl lst | null lst = error "Недопустимый аргумент!" | True = (head.reverse) lst (4) xinLst:: [Int] -> Bool xinLst lst | null lst = undefined | True = elem (head lst) (tail lst) (5) swap lst = reverse (head lst : (reverse (head (reverse lst): reverse (tail (reverse (tail lst)))))
2*. Напишите функцию, определяющую модуль разности первого и последнего элементов числового списка.
3*. Напишите функцию, определяющую индекс элемента числового списка, значение которого равно сумме первого и последнего элемента того же списка.
4*. Напишите функцию, определяющую, равен ли "центральный" элемент числового списка произведению крайних элементов.
5*. Напишите предикат, определяющий, является ли произведение элементов числового списка факториалом числа, равного длине списка.
6*. Напишите предикат, определяющий, все ли элементы числового списка являются: (1) трёхзначными числами; (2) чётными числами.
7*. Напишите функцию, возвращающую по заданному списку целых чисел список их факториалов. Определение факториала числа реализуйте с помощью нерекурсивной функции.
8*. Напишите предикат, определяющий, встречается ли указанный своим индексом элемент первого заданного списка во втором заданном списке.
9. Напишите функцию, которая по двум спискам, имеющим одинаковую длину, возвращает:
10*. По закону Российской федерации производители обязаны маркировать продукцию с генетически модифицированными ингредиентами с помощью номера (PLU-кода) на наклейке производителя; при этом:
11. Напишите функцию, определяющую в списке, содержащем списки целых чисел, количество таких списков, содержащих заданное число.
12. (Покер.) Задан список из пяти чисел. Если одинаковы 5 чисел, то напечатайте число 1, иначе если одинаковы 4 числа, то напечатайте число 2, иначе если одинаковы 3 и 2 числа, то напечатайте число 3, иначе если одинаковы 3 числа, то напечатайте число 4, иначе если одинаковы 2 и 2 числа, то напечатайте число 5, иначе если одинаковы 2 числа, то напечатайте 6, иначе напечатайте число 7.
13*. Напишите функцию, возвращающую наибольший элемент списка типа [[Int]].
1*. Напишите функцию, удаляющую "крайние" элементы списка.
2*. Напишите функцию, меняющую местами "крайние" элементы списка.
3. Напишите функцию, меняющую местами пару элементов списка по их указанным индексам.
4. Напишите функцию, добавляющую в начало списка копию его предпоследнего элемента.
5. Напишите функцию, удваивающую первый элемент списка (путём создания копии), если его значение меньше значения второго элемента.
1*. Напишите функцию, объединяющую первую "половину" элементов первого списка со второй "половиной" элементов второго списка.
2*. Напишите функцию, объединяющую три заданных списка в один, после предварительного удаления из них последних элементов.
3*. Напишите функцию, конструирующую список из "центральных" элементов трёх заданных списков.
4*. Напишите функцию, объединяющую два заданных списка, если сумма максимального элемента первого списка и минимального элемента второго списка равна заданному числу; в противном случае функция возвращает пустой список.
5*. Напишите функцию, конструирующую список из заданных списков [A1,A2,...,An] и [B1,B2,...,Bn] следующим образом:
(1) если A1=Bn и An=B1, то [A2,...,An-1,B2,...,Bn-1]; (2) если A1=Bn и An≠B1, то [A2,...,An,B1,...,Bn-1]; (3) если A1≠Bn и An=B1, то [A1,...,An-1,B2,...,Bn]; (4) в противном случае [A1,...,An,B1,...,Bn].
6*. Напишите функцию, конструирующую список из двух заданных таким образом, что из первого списка берутся только отрицательные числа, а из второго - только положительные.
7*. Напишите функцию, конструирующую список путём утраивания его каждого элемента.
1. Сформулируйте правило перевода списочной записи в точечную.
2. Изобразите с помощью графической нотации следующие списки:
(1) []; (2) [[[]]]; (3) [1,2,3]; (4) [[11,22,33]]; (5) [[[-1,-2,-3]],[[-123]],[[]],[[9,5,14,56]]].
3. Запишите структуру со следующим графическим представлением в списочной нотации:
4*. Проверьте с помощью интерпретатора Haskell результат интерпретации следующих списков:
(1) ['s','t','r','i','n','g']; (2) [' ']; (3) [[[' ']],[['o']],[[' ']]]; (4) [['h','e','a','d'],['t','a','i','l']]; (5) [['h','e','a','d'],['t'],['a'],['i'],['l']].
5. Переведите следующие точечные записи списка в списочные:
(1) (1:(2:(3:(4:(5:[]))))); (2) ((1:[]):((2:[]):((3:[]):[]))); (3) (((2:(1:[])):[]):[]); (4) ((5:(1:[])):((2:(3:[])):[])); (5) (((1:[]):((2:[]):[])):(((3:[]):[]):[])).
6. Сформулируйте правило перевода списочной записи списка в точечную, действие которого рассмотрим на примерах:
(1) [[[1]]] --> (((1:[]):[]):[]); (2) [[1,2],[3]] --> ((1:(2:[]))):((3:[]):[])).
7. Переведите следующие списочные записи списка в точечные:
(1) []; (2) [[]]; (3) [[1],[2],[3],[4]]; (4) [[1,2],[3,4]]; (5) [[1],[2,22],[3,33,333]]; (6) [[[9,8,7,6]],[[5,4,3]],[[2,1]],[[0]]].
Со следующего шага мы начнем рассматривать простую рекурсию на списках.