Declaratieve Talen/Oplossing Stern-Brocot

Uit Wina Examenwiki
Versie door Vincent (overleg | bijdragen) op 8 feb 2008 om 23:27 (New page: Verbeteringen altijd welkom. data RatGetal = Rat Int Int deriving Show naarFloat :: RatGetal -> Float naarFloat (Rat t n) = fromIntegral(t)/fromIntegral(n) instan...)
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

Verbeteringen altijd welkom.

   data RatGetal = Rat Int Int deriving Show
   
   naarFloat :: RatGetal -> Float
   naarFloat (Rat t n) = fromIntegral(t)/fromIntegral(n)
   
   instance Eq RatGetal where
       (Rat lt ln) == (Rat rt rn) = lt*rn == ln*rt
   
   instance Ord RatGetal where
       (Rat lt ln) <= (Rat rt rn) = lt*rn <= ln*rt
   
   --aangezien de boom oneindig is moeten we geen bladeren voorzien
   data Boom a = Knoop a (Boom a) (Boom a) deriving Show
   
   sbBoom :: Boom RatGetal
   sbBoom = sbDeelBoom (Rat 0 1) (Rat 1 0)
   
   sbDeelBoom :: RatGetal -> RatGetal -> (Boom RatGetal)
   sbDeelBoom (Rat lt ln) (Rat rt rn) =
       let k = Rat (lt+rt) (ln+rn)
           in Knoop k (sbDeelBoom (Rat lt ln) k) (sbDeelBoom k (Rat rt rn))
   
   
   vindGetal :: Float -> Float -> RatGetal
   vindGetal l r = doorzoekBoom l r sbBoom
   
   doorzoekBoom :: Float -> Float -> (Boom RatGetal) -> RatGetal
   doorzoekBoom l r (Knoop k lb rb)
       |naarFloat(k) < l   = doorzoekBoom l r rb
       |naarFloat(k) > r   = doorzoekBoom l r lb
       |otherwise          = k
   
   
   enc :: (Int,Int) -> String
   enc (t,n) = doorzoekBoom2 (Rat t n) sbBoom
   
   doorzoekBoom2 :: Ord a => a -> (Boom a) -> String
   doorzoekBoom2 d (Knoop k lb rb)
       |k < d      = "R" ++ doorzoekBoom2 d rb
       |k > d      = "L" ++ doorzoekBoom2 d lb
       |otherwise  = ""