haskell bináris keresési fa

szavazat
0
module Main where

import Data.List
import Data.Function

type Raw = (String, String)

icards =  [(the, le),(savage, violent),(work, travail),
           (wild, sauvage),(chance, occasion),(than a, qu'un)]

data Entry = Entry {wrd, def :: String, len :: Int, phr :: Bool}
             deriving Show

-- French-to-English, search-tree section

entries' :: [Entry]
entries' = map (\(x, y) -> Entry y x (length y) (' ' `elem` y)) icards

data Tree a = Empty | Tree a (Tree a) (Tree a)

tree :: Tree Entry
tree = build entries'

build :: [Entry] -> Tree Entry
build []     = Empty
build (e:es) = ins e (build es)

ins :: Entry -> Tree Entry -> Tree Entry

...

find :: Tree Entry -> Word -> String

...

translate' :: String -> String
translate' = unwords . (map (find tree)) . words

így próbálok tervezni funkció csínját találni, de ebben nem vagyok biztos, hogy hol start.any ötletek?

A kérdést 04/11/2011 04:48
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
2

Fogalmam sincs, hogy az milyen kritériumok fát kell válogatni, úgyhogy használja csak wrd. Akkor ez így néz ki:

ins :: Entry -> Tree Entry -> Tree Entry
ins entry Empty = Tree entry Empty Empty
ins entry@(Entry w _ _ _) (Tree current@(Entry w1 _ _ _) left right) 
   | w == w1 = error "duplicate entry"
   | w < w1 = Tree current (ins entry left) right
   | otherwise = Tree current left (ins entry right)  

Hogyan juthatunk el oda?

Mint mindig, amikor a rekurzió, szüksége van egy alapeset. Itt nagyon egyszerű: ha a fa üres, csak helyette egy csomópont, amely az adatokat. Nincsenek gyerekek az új csomópont, így használjuk Empty.

Az esetben, ha van egy teljes csomópont úgy néz ki, nehéz, de ez csak a miatt mintaillesztést, az ötlet nagyon egyszerű: Ha a bejegyzés a „kisebb”, akkor ki kell cserélni a bal gyermek egy változata, amely tartalmazza a bejegyzést, ha ez a „nagyobb” ki kell cserélni a megfelelő gyermek.

Ha mindkét csomópont és a bejegyzés ugyanolyan „méret” három lehetősége van: tartsa a régi csomópont, cserélje ki az újjal (tartva a gyermek), vagy dobja hibát (ami úgy tűnik, a legtisztább megoldás, így tettem itt).

Válaszolt 04/11/2011 08:39
a forrás felhasználó

szavazat
2

Egy egyszerű általánosítása Landei válasza:

ins :: Ord a => a -> Tree a -> Tree a
ins x Empty = Tree x Empty Empty
ins x (Tree x' l r) = case compare x x' of
  EQ -> undefined
  LT -> Tree x' (ins x l) r
  GT -> Tree x' l (ins x r)

Ahhoz, hogy ez a munka Tree Entry, akkor meg kell határozni egy példánya Ordaz Entry.

Válaszolt 04/11/2011 17:42
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more