Skip to content

Instantly share code, notes, and snippets.

@jsoffer
Created February 5, 2010 08:14
Show Gist options
  • Save jsoffer/295639 to your computer and use it in GitHub Desktop.
Save jsoffer/295639 to your computer and use it in GitHub Desktop.
data Estado = N | S | W deriving (Show, Eq)
d n = div n 2
dd n = div (n-1) 2
du n = div (n+1) 2
-- Reemplazar: no son tail recursive
dosportres :: Integer -> Integer
dosportres x = if even x then 3 * (dosportres (div x 2)) else x
dptdoble :: Integer -> Integer
dptdoble x = if (mod x 4 == 0) then 3 * (dptdoble (div x 4)) else x
paso :: (Estado, Integer) -> (Estado, Integer)
paso (e, 0) = (e, 0)
paso (N, x)
-- el ciclo de crecimiento/decrecimiento
| mod x 4 == 0 = paso (N, dptdoble x)
-- formas de no necesitar pasar por W con impar
| mod x 4 == 1 = paso (N, div (x-1) 4)
| mod x 4 == 3 = paso (S, (dd.dd) x)
-- | even x = paso (W, 3 * (d x)) -- si llega aquí, vuelve impar a x
-- | even x = paso (S, dd $ 3 * (d x))
| mod x 4 == 2 = paso (S, dd $ 3 * (d x))
paso (S, x)
| even x = paso (N, dosportres x)
| odd x = paso (N, du x)
paso (W, x)
| even x = paso (N, d x)
| odd x = paso (S, dd x)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment