Haskell binært søketre

stemmer
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

så jeg prøver å designe funksjons ins og finne, men jeg er ikke sikker på hvor du start.any ideer?

Publisert på 04/11/2011 klokken 03:48
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Jeg har ingen anelse av hvilke kriterier treet skal sorteres, så jeg bruker bare wrd. Da ville det se slik ut:

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)  

Hvordan komme seg dit?

Som alltid når du bruker rekursjon, trenger du en base case. Her er det veldig enkelt: Hvis treet er tom, bare erstatte den med en node som inneholder dataene. Det er ingen barn for ny node, så vi bruker Empty.

Tilfellet hvis du har en full node ser mer vanskelig, men dette er bare på grunn av mønstergjenkjenning, er ideen veldig enkel: Hvis oppføringen er "mindre" du må bytte venstre barn med en versjon som inneholder oppføringen, hvis det er "større" du må skifte høyre barn.

Hvis både node og oppføring har samme "størrelse" du har tre alternativer: beholde den gamle node, erstatte den med den nye (holde barna) eller kaste en feil (som synes den reneste løsningen, så jeg gjorde det her).

Svarte 04/11/2011 kl. 07:39
kilden bruker

stemmer
2

En enkel generalisering av Landei svar:

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)

For at dette skal fungere på Tree Entry, må du definere en forekomst av Ordfor Entry.

Svarte 04/11/2011 kl. 16:42
kilden bruker

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