Про деревья

Dec 21, 2011 14:55

Имеется тип

data Tree a = Nil | Branch (Tree a) a (Tree a)
Написать функцию

elemTree :: Eq a => a -> Tree a -> Bool
проверяющую наличие значения в дереве.

Первая приходящая в голову реализация не проходит следующий тест:

> let testTree n = Branch (testTree n) n (testTree (n+1))
> 3 `elemTree` (testTree 1)
True
Код теста специально сливается с ( Read more... )

fprog, haskell, сборник задач и упражнений по Хаскелю, fp

Leave a comment

antilamer December 21 2011, 13:26:37 UTC
о!!

elemTree a t = or [x==a | Branch _ x _ <- b] where b = t:[x | Branch l _ r <- b, x <- [l,r]]

:)

Reply

lomeo December 21 2011, 14:28:18 UTC
Супер! Особенно x <- [l,r] неожиданно. Хороший способ для ручного concat.

Reply

lomeo December 21 2011, 17:15:05 UTC
BTW, не вернёт никогда False :-(

Reply

antilamer December 21 2011, 18:03:30 UTC
Почему?

Reply

lomeo December 21 2011, 19:26:01 UTC
Потому что bfs не завершается: нет ограничивающего условия, b = .. <-b превращается в конце концов в b = b.

Проверь на elemTree 1 Nil, например.

Reply


Leave a comment

Up