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

Лабораторная работа 5 Простые числа и факторизация

Напишите функцию primesMy :: [Integer], строящую бесконечный список простых чисел. Найдите максимально большое простое число, которое ваша система позволяет найти за разумное время.

Напишите функцию factorizeMy :: Integer -> [Integer], которая разлагает заданное число на простые множители, возвращая список степеней при простых множителях. Например, раз 350 == 21*30*52*71, то factorizeMy 350 == [1,0,2,1].

Напишите функцию defactorizeMy :: [Integer] -> Integer, которая собирает обратно число, разложенное на простые множители. Например, defactorizeMy [1,0,2,1] == 350.

Напишите реализацию функций gcd и lcm с помощью factorizeMy и defactorizeMy.

Деревья

Определите тип данных дерева: data Tree a = Leaf a | Branch (Tree a) (Tree a) deriving Show, запросите и объясните тип функций-конструкторов-данных Leaf и Branch, постройте с помощью этих функций простейшие деревья. Объясните, какие деревья можно представить такой структурой данных, а какие нельзя.

Определите тип данных дерева: data Tree a = Empty | Branches a [Tree a] deriving Show, запросите и объясните тип функций-конструкторов-данных Empty и Branches, постройте с помощью этих функций простейшие деревья. Объясните, какие деревья можно представить такой структурой данных, а какие нельзя.

Напишите функцию fringeMy :: Tree a -> [a], возвращающую в произвольном порядке все листья дерева.

Напишите функцию mapTreeMy :: (a -> b) -> Tree a -> Tree b, применяющую к каждому элементу дерева заданную функцию без изменения структуры самого дерева.

Напишите функцию depthMy :: Tree a -> Integer, находящую глубину дерева – количество поддеревьев на пути к самой глубокой вершине.

Напишите функцию dfsMy :: Tree a -> [a], возвращающую все вершины дерева в порядке обхода дерева в глубину.

Напишите функцию bfsMy :: Tree a -> [a], возвращающую все вершины дерева в порядке обхода дерева в ширину.

Напишите функцию showTreeMy :: Tree a -> String, возвращающую текстовое представление дерева в виде последовательности строк с отступами (примерно как команда tree в командной строке MS Windows).

Определите тип данных для бинарного поискового дерева: data Ord a => SearchTree a = Empty | Branches a (SearchTree a) (SearchTree a) deriving (Show, Eq), запросите и объясните тип функций-конструкторов-данных Empty и Branches, постройте с помощью этих функций простейшие деревья.

Напишите функцию elemTreeMy :: Ord a => SearchTree a -> Bool, проверяющую правильность бинарного поискового дерева.

Напишите функцию checkTreeMy :: Ord a, Eq a => a -> SearchTree a -> Bool, проверяющую, есть ли конкретный элемент в дереве.

Напишите функцию putValMy :: Ord a => a -> SearchTree a -> SearchTree a, добавляющую в правильное бинарное поисковое дерево очередной элемент в нужное место.

Напишите функцию list2treeMy :: Ord a => [a] -> SearchTree a, создающую из пустого дерева правильное поисковое дерево путем добавления в дерево последовательно всех элементов списка.

Напишите функцию heightMy :: Ord a => SearchTree a -> Integer, находящую глубину дерева.

Напишите функцию checkhMy :: Ord a => SearchTree a -> Bool, проверяющую, является ли текущее бинарное поисковое дерево идеально сбалансированным.

Напишите функцию balanceMy :: Ord a => SearchTree a -> SearchTree a, создающую из поискового дерева идеально сбалансированное дерево.

Объясните, что вычисляет выражение and $ map checkhMy $ map balanceMy $ map list2treeMy $ permutations "abcdefgh".