Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MakeevGA-Haskell-a4-shortcode_2014_05_31.doc
Скачиваний:
15
Добавлен:
19.01.2023
Размер:
1.79 Mб
Скачать

Лабораторная работа 1 Простейшие функции

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:

(+), (-), (*), (/), div, mod, (^)

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных, и напишите свою реализацию каждой функции под другим именем (например, под именами sumMy, productMy, и т.д.):

sum, product

max, min

maximum, minimum

even, odd

gcd, lcm (greatest common divisor, least common multiple)

(^)

Напишите функцию factMy :: Integer -> Integer, которая вычисляет факториал заданного числа, с помощью простой рекурсии.

Напишите функцию fibMy :: Integer -> Integer, которая вычисляет заданное по номеру число Фибоначчи с помощью простой рекурсии. Найдите, какое максимально большое число позволяет вам найти ваша система. Объясните, почему рекурсия так долго работает.

Попробуйте придумать более эффективную функцию вычисления числа Фибоначчи в виде рекурсивной функции вида fibMy' n prev prevprev = ..., которая принимает в качестве параметров предыдущее и пред-предыдущее число Фибоначчи.

Простейшие логические функции

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:

(>), (<), (==), (/=), (>=), (<=), (&&), (||), not

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных, и напишите свою реализацию каждой функции под другим именем:

and, or

Простейшие списочные функции

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных:

(:), null

Запросите в интерпретаторе и объясните тип функций, проверьте их поведение на примерах входных данных, и напишите свою реализацию каждой функции под другим именем:

head, tail

last, init

length, (!!), (++), concat

take, drop

reverse, elem, replicate

Напишите функцию lookupMy :: Eq a => a -> b -> [(a, b)] -> b, которая берет значение xa типа a, значение xb типа b, список кортежей [(a, b)], находит кортеж, в котором первый элемент равен xa, и выводит второй элемент этого кортежа. Если такого кортежа не нашлось, функция должна вернуть xb.

Напишите функцию substrMy :: [a] -> Int -> Int -> [a], которая возвращает все элементы списка начиная с какого-то и заканчивая каким-то с помощью функций take и drop.

Напишите функцию strReplaceMy :: Eq a => [a] -> [a] -> [a], которая принимает три списка и заменяет в третьем списке все вхождения первого списка на второй список с помощью функций length, (==), take и drop.

Напишите функцию elemIndices :: Eq a => a -> [a] -> [Int], которая находит, под какими индексами в списке встречается заданный элемент.

Напишите функцию strPosMy :: Eq a => [a] -> [a] -> [Int], которая находит все вхождения первого списка во второй и возвращает список номеров элементов, с которых эти вхождения начинаются с помощью функций length, (==), take и drop.

Напишите функцию strRotateMy :: [a] -> Int -> [a], которая производит заданное количество поворотов заданного списка. Операция кругового поворота над списком заключается в том, что последний элемент списка переносится в его начало. Например, strRotate [1,2,3,4,5,6] 2 = [5,6,1,2,3,4].

Напишите функцию unevenHandWritingMy :: String -> String, которая берет строку и возвращает ее же, но каждая третья буква должна стать прописной, если была строчной и наоборот.