Declaratieve Talen/Oplossing Stern-Brocot
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 = ""