Declaratieve Talen/Oplossing Stern-Brocot: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Vincent (overleg | bijdragen)
New page: Verbeteringen altijd welkom. data RatGetal = Rat Int Int deriving Show naarFloat :: RatGetal -> Float naarFloat (Rat t n) = fromIntegral(t)/fromIntegral(n) instan...
 
Geen bewerkingssamenvatting
 
Regel 41: Regel 41:
         |k > d      = "L" ++ doorzoekBoom2 d lb
         |k > d      = "L" ++ doorzoekBoom2 d lb
         |otherwise  = ""
         |otherwise  = ""
----
Een oplossing die gebruik maakt van het voorgedefinieerde "Rational"
import Ratio
data Boom a = Knoop a (Boom a) (Boom a)
deriving Show
data Rationaal= Rationaal Rational|Inf
noemer::Rationaal->Integer
noemer (Rationaal r)= denominator r
noemer Inf = 0
teller::Rationaal->Integer
teller (Rationaal r)= numerator r
teller Inf = 1
waarde::Rational-> Float
waarde r= (fromInteger (numerator r))/(fromInteger (denominator r))
stern_brocot::Boom Rational
stern_brocot = genereer (Rationaal (0 % 1)) Inf
genereer:: Rationaal -> Rationaal -> Boom Rational
genereer r1 r2 = let t1 = teller r1
t2 = teller r2
n1 = noemer r1
n2 = noemer r2
waarde = (t1+t2) % (n1+n2)
nieuwe = Rationaal waarde
in Knoop waarde (genereer r1 nieuwe) (genereer nieuwe r2)
vindGetal::Float -> Float -> Rational
vindGetal x y |x>y = vindGetal y x
|otherwise = zoek x y stern_brocot
zoek::Float -> Float -> Boom Rational -> Rational
zoek x y (Knoop rat l r) |(waarde rat)<x = zoek x y r
|(waarde rat)>y = zoek x y l
|otherwise = rat
enc::Rational->String
enc x = zoek_schrijf x stern_brocot
zoek_schrijf::Rational -> Boom Rational -> String
zoek_schrijf x (Knoop rat l r) |rat<x = "R"++ zoek_schrijf x r
|rat>x =  "L" ++ zoek_schrijf x l
|otherwise = ""

Huidige versie van 9 jan 2009 14:20

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  = ""



Een oplossing die gebruik maakt van het voorgedefinieerde "Rational"

import Ratio 
data Boom a = Knoop a (Boom a) (Boom a)
	deriving Show
data Rationaal= Rationaal Rational|Inf

noemer::Rationaal->Integer
noemer (Rationaal r)= denominator r
noemer Inf = 0

teller::Rationaal->Integer
teller (Rationaal r)= numerator r
teller Inf = 1

waarde::Rational-> Float
waarde r= (fromInteger (numerator r))/(fromInteger (denominator r))

stern_brocot::Boom Rational
stern_brocot = genereer (Rationaal (0 % 1)) Inf

genereer:: Rationaal -> Rationaal -> Boom Rational
genereer r1 r2 = 	let 	t1 = teller r1
				t2 = teller r2
				n1 = noemer r1
				n2 = noemer r2
				waarde = (t1+t2) % (n1+n2)
				nieuwe = Rationaal waarde
			in Knoop waarde (genereer r1 nieuwe) (genereer nieuwe r2)

vindGetal::Float -> Float -> Rational
vindGetal x y	|x>y = vindGetal y x
		|otherwise = zoek x y stern_brocot

zoek::Float -> Float -> Boom Rational -> Rational
zoek x y (Knoop rat l r)	|(waarde rat)<x = zoek x y r
				|(waarde rat)>y = zoek x y l
				|otherwise = rat 

enc::Rational->String
enc x = zoek_schrijf x stern_brocot

zoek_schrijf::Rational -> Boom Rational -> String
zoek_schrijf x (Knoop rat l r)	|rat<x = "R"++ zoek_schrijf x r
				|rat>x =  "L" ++ zoek_schrijf x l
				|otherwise = ""