Шаг 82.
Основы языка Haskell.
Функции обработки списков. Задачи для самостоятельного решения

    На этом шаге мы приведем задачи для самостоятельного решения.


   Замечание. Найдите ошибки, описки, неточности и прочие изъяны в приведенных задачах.

1. Обработка элементов списка

    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-кода) на наклейке производителя; при этом:

По заданному PLU-коду установите свойства продукта.

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

    12. (Покер.) Задан список из пяти чисел. Если одинаковы 5 чисел, то напечатайте число 1, иначе если одинаковы 4 числа, то напечатайте число 2, иначе если одинаковы 3 и 2 числа, то напечатайте число 3, иначе если одинаковы 3 числа, то напечатайте число 4, иначе если одинаковы 2 и 2 числа, то напечатайте число 5, иначе если одинаковы 2 числа, то напечатайте 6, иначе напечатайте число 7.

    13*. Напишите функцию, возвращающую наибольший элемент списка типа [[Int]].

2. Трансформация списка

    1*. Напишите функцию, удаляющую "крайние" элементы списка.

    2*. Напишите функцию, меняющую местами "крайние" элементы списка.

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

    4. Напишите функцию, добавляющую в начало списка копию его предпоследнего элемента.

    5. Напишите функцию, удваивающую первый элемент списка (путём создания копии), если его значение меньше значения второго элемента.

3. Конструирование конечных списков

    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*. Напишите функцию, конструирующую список путём утраивания его каждого элемента.

4. Списочная, точечная и графическая запись списков

    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]]].
Проверьте результат с помощью интерпретатора Haskell, вводя в командной строке полученные точечные записи списков.

    Со следующего шага мы начнем рассматривать простую рекурсию на списках.




Предыдущий шаг Содержание Следующий шаг