Declaratieve Talen/Oplossing Oneindige rij: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Michael Gobbers (overleg | bijdragen)
3de alternatief voor oneindige rij oplossing toegevoegd
Michael Gobbers (overleg | bijdragen)
Geen bewerkingssamenvatting
Regel 30: Regel 30:


===Alternatief 3===
===Alternatief 3===
infinite::t->([t]->t)->[t]
infinite::t->([t]->t)->[t]
infinite x f = (f [x]):infinite2 [x] f
infinite x f = (f [x]):infinite2 [x] f
 
infinite2::[t]->([t]->t)->[t]
infinite2::[t]->([t]->t)->[t]
infinite2 (x:xs) f = f (x:xs):infinite2 ((x:xs) ++ [f (x:xs)]) f
infinite2 (x:xs) f = f (x:xs):infinite2 ((x:xs) ++ [f (x:xs)]) f

Versie van 19 jan 2011 13:42

Een oplossing

infinite :: t -> ([t]->t) -> [t]

infinite b f = b:(infinite2 [b] f)
    where infinite2 voorstuk f =
         let
              res = f voorstuk
         in
              res:(infinite2 (voorstuk ++ [res]) f)


De clou is het begin van de rij bijhouden in een parameter. M'n inspiratie kwam uit de Fibonacci-rij op p.26

Alternatief

infinite::t->([t]->t)->[t]
infinite x f = x:inf [x] f
 where
	inf r f = f r : inf ((f r):r) f

Roald 12 jan 2010 22:37 (UTC)

Nog een alternatief

Dit onafhankelijk van Roald opgelost. Het idee is hetzelfde, maar ik bouw de lijst in de omgekeerde richting op.

infinite x f = infinite' [x] f
	where
		infinite' l f = (last l) : (infinite' (l ++ [f l]) f)

Kasper Meerts 15 jul 2010 21:12 (UTC)

Alternatief 3

infinite::t->([t]->t)->[t]
infinite x f = (f [x]):infinite2 [x] f
infinite2::[t]->([t]->t)->[t]
infinite2 (x:xs) f = f (x:xs):infinite2 ((x:xs) ++ [f (x:xs)]) f