Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Haskell - Бинарные деревья 
V
    Опции темы
mad123
Дата 11.5.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.1.2011

Репутация: нет
Всего: нет



Добрый день.
Помогите, пожалуйста, написать программу на Haskell.

Выделить метку вершины дерева, имеющую наибольшее число вхождений. 
PM MAIL   Вверх
mad123
Дата 17.5.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.1.2011

Репутация: нет
Всего: нет



Вот мне предложили решение
Код

data BinTree a = Nil
               | Node a (BinTree a) (BinTree a)
                 deriving (Eq, Show)
 
maxLabel :: (Eq a) => BinTree a -> Maybe a
maxLabel Nil = Nothing
maxLabel tree = Just ml
    where (ml, _) = foldl1 maxLabelOcc . countLabels . labels $ tree
          maxLabelOcc l1@(_, c1) l2@(_, c2) =
              if c1 > c2 then l1 else l2
 
          labels :: BinTree a -> [a]
          labels Nil = []
          labels (Node x l r) = x : labels l ++ labels r
 
          countLabels :: (Eq a) => [a] -> [(a, Int)]
          countLabels list = map cnt list
              where cnt x = (x, foldl (\acc el -> acc + if x == el then 1 else 0) 0 list)


Я его подправил, но что-то не то =(

Код

data BinTree a = Nil  | Node a (BinTree a) (BinTree a) | Leaf a
 
maxLabel :: (Eq a) => BinTree a -> Maybe a
maxLabel Nil = Nothing
maxLabel tree = Just ml
    where (ml, _) = foldl1 maxLabelOcc . countLabels . labels $ tree
          maxLabelOcc l1@(_, c1) l2@(_, c2) =
              if c1 > c2 then l1 else l2
 
          labels :: BinTree a -> [a]
          labels Nil = []
          --labels (Leaf x) = x
          labels (Node x l r) = x : labels l ++ labels r
 
          countLabels :: (Eq a) => [a] -> [(a, Int)]
          countLabels list = map cnt list
              where cnt x = (x, foldl (\acc el -> acc + if x == el then 1 else 0) 0 list)

tree = Node "alpha" (Leaf "alpha") (Node "beta" (Leaf "gamma") (Leaf "delta"))

main = print $ maxLabel tree


помогите подправить

Это сообщение отредактировал(а) mad123 - 17.5.2011, 12:57
PM MAIL   Вверх
Void
Дата 17.5.2011, 14:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Цитата(mad123 @  17.5.2011,  14:54 Найти цитируемый пост)
--labels (Leaf x) = x

Код
labels (Leaf x) = [x]

В остальном всё правильно.

Ну ещё я бы переписал maxLabelOcc и countLabels поизящнее на ФВП. countLabels квадратичная, но на одном Eq по-другому не сделаешь.
Код
import Data.List (maximumBy)
import Data.Function (on)

data BinTree a = Nil | Node a (BinTree a) (BinTree a) | Leaf a
 
maxLabel :: (Eq a) => BinTree a -> Maybe a
maxLabel Nil = Nothing
maxLabel tree = Just ml
    where (ml, _) = maxLabel . countLabels . labels $ tree
          maxLabel = maximumBy (compare `on` snd)
 
          labels :: BinTree a -> [a]
          labels Nil = []
          labels (Leaf x) = [x]
          labels (Node x l r) = x : labels l ++ labels r
 
          countLabels :: (Eq a) => [a] -> [(a, Int)]
          countLabels list = map cnt list
              where cnt x = (x, length $ filter (== x) list)



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mad123
Дата 17.5.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.1.2011

Репутация: нет
Всего: нет



Не получилось запустить.
Выдает следующее

ERROR file:.\Main3.hs - Can't find imported module "Data.Function"

Как я понимаю не удалось подключить модуль.

Как это можно решить?
PM MAIL   Вверх
Void
Дата 17.5.2011, 14:40 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Цитата(mad123 @  17.5.2011,  16:26 Найти цитируемый пост)
ERROR file:.\Main3.hs - Can't find imported module "Data.Function"

Hugs, насколько я понимаю? Тогда проще оставить первоначальный вариант. Я на GHC рассчитывал.

Это сообщение отредактировал(а) Void - 17.5.2011, 14:41


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mad123
Дата 18.5.2011, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.1.2011

Репутация: нет
Всего: нет



Спасибо, разабрался!

Это сообщение отредактировал(а) mad123 - 18.5.2011, 09:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.