Guest User

Untitled

a guest
May 25th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.39 KB | None | 0 0
  1. import Data.List
  2.  
  3. {- Дефиниция на типа Tree a описващ произволно двоично дърво. -}
  4. data Tree a = Empty | Node a (Tree a) (Tree a)
  5. deriving (Read, Show)
  6.  
  7. -- помощна ф-я, връщаща стойностите на ниво k.
  8. nodesAtLevel :: (Eq b, Num b) => Tree a -> b -> [a]
  9. nodesAtLevel Empty _ = []
  10. nodesAtLevel (Node x _ _) 0 = [x]
  11. nodesAtLevel (Node _ left right) n = nodesAtLevel left (n - 1) ++ nodesAtLevel right (n - 1)
  12.  
  13.  
  14. {-
  15. Задача 1.
  16. а). Напишете функцията distance f xys, която приема едноместна функция f
  17. и списък от двойки (x, y) и връща сбора от разстоянията |y - f(x)| между f(x)
  18. и y, за всички елементи от списъка (в случая |a| означава абсолютната стойност
  19. на числото а).
  20.  
  21. Ще наричаме резултата на тази функция, разстояние на функцията f от xys.
  22.  
  23. Примери:
  24. distance (\x -> x ^ 2) [(1, 1), (2, 4), (3, 9), (4, 15)] = 1
  25. distance (\x -> x + 1) [(1, 1), (2, 4), (3, 9), (4, 15)] = 17
  26.  
  27. б). Напишете функцията closest fs xys, която приема списък от едноместни функции fs
  28. и списък от двойки xys и връща фукцията от fs, която е на най-малко разстояние от xys.
  29.  
  30. Примери:
  31. (closest [(\x -> x ^ 2), (\x -> x + 1)] [(1, 1), (2, 4), (3, 9), (4, 15)]) 5 = 25
  32. -}
  33. -- 1.а.
  34. distance :: (Double -> Double) -> [(Double, Double)] -> Double
  35. distance f xys = sum [abs(y - f x) | (x, y) <- xys]
  36.  
  37. -- 1.б.
  38. closest' :: [(Double -> Double)] -> [(Double, Double)] -> (Double -> Double)
  39. closest' fs xys = argmin (\f -> distance f xys) fs
  40.  
  41. argmin f xs = head [ x | x <- xs, f x == m] where
  42. m = minimum (map f xs)
  43.  
  44.  
  45. closest :: [(Double -> Double)] -> [(Double, Double)] -> (Double -> Double)
  46. closest [] _ = error "empty list"
  47. closest [f] _ = f
  48. closest (f:fs) xys =
  49. let
  50. mf = closest fs xys
  51. in
  52. if distance f xys < distance mf xys
  53. then f
  54. else mf
  55.  
  56. {-
  57. Задача 2.
  58. а). Дефинирайте типа Book, който има следните атрибути (компоненти): заглавие, година на
  59. издаване и брой продадени копия.
  60. б). Дефинирайте "помощните" функции title, published и sales, който връщат съответно
  61. заглавието, годината на издаване и броя продадени копия на дадена книга.
  62. в). Дефинирайте фукцията bestsellers books, която приема списък от книги и връща всички
  63. бестселъри (книги, който са били продадени в повече от 1 милион екземпляра).
  64. г). Дефинирайте функцията newTitles books year, която приема списък от книги и година,
  65. и връща заглавията на тези от тях, които са издадени през дадената година.
  66. -}
  67. data Book = Book String Int Int
  68. deriving (Read, Show)
  69.  
  70. type Title = String
  71. type Published = Year
  72. type Year = Int
  73. type CopiesSold = Int
  74.  
  75. title :: Book -> String
  76. title (Book t _ _) = t
  77.  
  78. published :: Book -> Int
  79. published (Book _ p _) = p
  80.  
  81. sales :: Book -> Int
  82. sales (Book _ _ s) = s
  83.  
  84. bestsellers :: [Book] -> [Book]
  85. bestsellers books = filter (\b -> sales b > 1000000) books
  86.  
  87. newTitles :: [Book] -> Int -> [String]
  88. newTitles books year = [title b | b <- books, published b == year]
  89.  
  90.  
  91. {-
  92. Задача 3. Дефинирайте функциата treePaths tree, която връща всички пътища
  93. от корена на дървото до листата му.
  94. -}
  95. treePaths :: Tree a -> [[a]]
  96. treePaths Empty = []
  97. treePaths (Node x Empty Empty) = [[x]]
  98. treePaths (Node x left right) = [x:ps | ps <- treePaths left ++ treePaths right]
  99.  
  100. {-
  101. Задача 4. Нека е дадено двоично дърво tree. Дефинирайте функцията
  102. findMeanNodes tree, която връща списък с всички нодове на tree, чиято
  103. стойност е равна на средното аритметично на родителя (ако има такъв)
  104. и децата на дадения нод.
  105. -}
  106.  
  107. avg xs = sum xs / fromIntegral(length xs)
  108.  
  109. children tree = nodesAtLevel tree 1
  110.  
  111. findMeanNodes' :: (Eq a, Fractional a) => Tree a -> [a]
  112. findMeanNodes' Empty = []
  113. findMeanNodes' tree@(Node x left right)
  114. | x == avg (children tree) = x : meanChildren
  115. | otherwise = meanChildren where
  116. meanChildren = helper x left ++ helper x right
  117. helper _ Empty = []
  118. helper parent node@(Node x left right)
  119. | x == avg (parent:children node) = x : meanChildren2
  120. | otherwise = meanChildren2 where
  121. meanChildren2 = helper x left ++ helper x right
  122.  
  123.  
  124. findMeanNodes :: (Eq a, Fractional a) => Tree a -> [a]
  125. findMeanNodes tree = helper tree (children tree) where
  126. helper Empty _ = []
  127. helper(Node x left right) nodes
  128. | null nodes = []
  129. | x == avg nodes = x:meanChildren
  130. | otherwise = meanChildren where
  131. meanChildren = helper left(x:children left) ++ helper right(x:children right)
  132.  
  133.  
  134. {-
  135. Задача 5. Да се дефинира функция findGrandpas tree, която за дадено двоично дърво от
  136. естествени числа tree намира списък от всички числа - върхове на tree, които са равни на
  137. сумата от внуците си. Напишете и примерни извиквания на дефинираната функция.
  138. -}
  139. findGrandpas :: (Eq a, Num a) => Tree a -> [a]
  140. findGrandpas tree = undefined
  141.  
  142.  
  143. -- примерни извиквания --
  144. main :: IO()
  145. main =
  146. let
  147. books = [
  148. Book "Gone with the Wind" 1936 35000000,
  149. Book "To Kill a Mockingbird" 1960 32000000,
  150. Book "Chocolate" 1999 995000]
  151. b = head books
  152. {-
  153. В примерите ще използваме следното дърво (tree):
  154.  
  155. 3
  156. / \
  157. 1 4
  158. / \ / \
  159. 0 2 5
  160. / \ / \ / \
  161. 6
  162. -}
  163. tree = (Node 3 (Node 1 (Node 0 Empty Empty) (Node 2 Empty Empty)) (Node 4 Empty (Node 5 Empty (Node 6 Empty Empty))))
  164. in do
  165. -- Задача 1.
  166. print $ distance (\x -> x ^ 2) [(1, 1), (2, 4), (3, 9), (4, 15)]
  167. print $ distance (\x -> x + 1) [(1, 1), (2, 4), (3, 9), (4, 15)]
  168. print $ closest [(\x -> x ^ 2), (\x -> x + 1)] [(1, 1), (2, 4), (3, 9), (4, 15)] 5
  169.  
  170. -- Задача 2.
  171. print $ b
  172. print $ title $ b
  173. print $ published $ b
  174. print $ sales $ b
  175. print $ bestsellers books
  176. print $ newTitles books 1999
  177.  
  178. -- Задача 3.
  179. print $ treePaths tree
  180.  
  181. -- Задача 4.
  182. print $ findMeanNodes Empty
  183. print $ findMeanNodes tree
  184. print $ findMeanNodes (Node 2 (Node 1 Empty Empty) (Node 3 Empty Empty))
  185.  
  186. -- Задача 5.
  187. print $ findGrandpas Empty
  188. print $ findGrandpas tree
Add Comment
Please, Sign In to add comment