Шаг 86.
Основы языка Haskell.
Простая рекурсия на списках. Задачи для самостоятельного решения

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


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

1. Подсчёт элементов одноуровневого списка

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

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

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

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

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

    6*. Даны две строки. Найдите расстояние Хэмминга между ними.


   Указание. Расстоянием Хэмминга. между строками одинаковой длины s1  и s2 называется количество несовпадающих символов в s1 и s2, стоящих на одинаковых позициях.

    7*. ([1, с.68,№7.60]) Прочитайте строку и сообщите, сколько раз встречается нужный символ.


   Указание. Нужным символом называется символ, который встречается в заданной строке чаще других.

2. Свойства элемента одноуровневого списка

    1*. Напишите функцию, возвращающую элемент по номеру его расположения в списке.

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

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

    4. ([1, с.67-68,№7.57]) Напишите программу, запрашивающую число (не более 100 знаков) и печатающую слово "Плавное", если число плавное, и "Нет" в противном случае.


   Указание. Плавным числом назовём десятичное натуральное число, у которого любые две соседние цифры отличаются не более чем на единицу. Однозначное число является плавным.

3. Трансформация одноуровневого списка

    1*. Напишите функцию, увеличивающую каждый элемент числового списка в k раз.

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

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

   [1,2,3,4,5,6] -> [2,1,4,3,6,5],
   [1,2,3]       -> [2,1,3].

    4*. Напишите функцию, которая по двум заданным спискам выводит единый список, элементы которого образованы путём сложения элементов исходных списков, стоящих на одинаковых позициях.

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

    6. Напишите функцию, обращающую каждый элемент списочной структуры (т.е. списки), а также саму списочную структуру. Например:

   [1,2,3,4,5,6,7,8,9] -> [9,8,7,6,5,4,3,2,1],
   [[1,2],[3],[4,5,6]] -> [[6,5,4],[3],[2,1]],
   [[[1,(-2),(-5),10]],[[(-3),(-2),1]]]
                       -> [[[1,(-2),(-3)]],[[10,(-5),(-2),1]]].

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

    8. Укажите назначение следующих функций:

   add1:: [Integer] -> Int -> [Integer]
   add1 lst k = take (k-1) lst ++ [1+lst !! (k-1)] 
                               ++ drop k lst
   -----------------------------------------
   add12:: [Integer] -> Int -> [Integer]
   add12 lst k | k==0 = lst
               | k==1 = 1+head lst : add1' (tail lst) (k-1)
               | True = head lst : add1' (tail lst) (k-1)
   ------------------------------------------------------
   prom1:: [Integer] -> Int -> [Integer]
   prom1 lst k = [lst !! (k-1),lst !! k]
   ------------------------------------------------           
   prom2 lst k | k==1 = [head lst, head $ tail lst]
               | True = prom' (tail lst) (k-1)
   -------------------------------------------
   -- Неудачные тестовые примеры:
   -----------------------------------------------
   test1 =   add1 [1,1,1,1,1,1] 6 == [1,1,1,1,1,2]
          && add1 [1,1,1,1,1,1] 1 == [2,1,1,1,1,1]
   test2 =   add2 [1,1,1,1,1,1] 3 == [1,1,2,1,1,1]
          && add2 [1] 1           == [2]
          && add2 [1,1,1,1,1,1] 1 == [2,1,1,1,1,1]
   test3 = prom1 [1,2,3,4,5,6]  5 == [5,6]
   test4 = prom2 [1,2,3,4,5,6]  2 == [2,3]

    9. Укажите назначение следующей функции:

   swap lst i j
       | null lst || i==j || lst !! i==lst !! j
              = lst
       | i<j  = take i lst ++ [lst !! j] ++
                take (j-i-1) (drop (i+1) lst) ++
                [lst !! i] ++ drop (j+1) lst
       | True = swap lst j i
   ------------------------------
   -- Неудачные тестовые примеры:
   ---------------------------------------------------
   test =   swap [3,4, 5,6,7,89,0,12,34,55,666,78] 5 2
              == [3,4,89,6,7, 5,0,12,34,55,666,78]
         && swap [0,45,3,2,4] 2 4 == [0,45,4,2,3]
         && swap [4,6,7,5] 3 1    == [4,5,7,6]
         && swap [2,3,4,5,6,1,45,234,36] 5 2
                                  == [2,3,1,5,6,4,45,234,36]

    10*. Напишите функцию, моделирующую функционал map.

    11*. [1, с.104,№10.42] Определим последовательность  строк Фибоначчи s1,s2,...,sk,... следующим образом:

   s1='b', s2='a', sk=sk-1sk-2, k>2.
Тогда начало последовательности строк Фибоначчи выглядит так:
  b,a,ab,aba,abaab,abaababa,abaababaabaab.
  1. Чему равна длина sk?
  2. Дано k. Найдите sk.
  3. Дана строка s. Проверьте, не является ли она последовательностью Фибоначчи.

    12*. [1, с.146,№13.3] Можно ли разбить заданную строку на две части так, чтобы, переставив их местами, получить результирующую?


(1)Анисимов А.Е., Пупышев В.В. Сборник заданий по основаниям программирования. - М.: Интернет-Университет Информационных Технологий; БИНОМ. Лаборатория знаний, 2006. - 248 с.

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




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