-- 1ª solución
-- ===========
mayorLongitud1 :: Int -> Int -> Int
mayorLongitud1 i j = maximum [length (sucesion k) | k <- [i..j]]
-- (sucesion n) es la sucesión 3n+1 generada por n. Por ejemplo,
-- sucesion 22 == [22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1]
sucesion :: Int -> [Int]
sucesion 1 = [1]
sucesion n | even n = n : sucesion (n `div` 2)
| otherwise = n : sucesion (3*n+1)
-- 2ª solución
-- ===========
mayorLongitud2 :: Int -> Int -> Int
mayorLongitud2 i j = maximum [longitud k | k <- [i..j]]
-- (longitud n) es la longitud de la sucesión 3n+1 generada por n. Por
-- ejemplo,
-- longitud 22 == 16
longitud :: Int -> Int
longitud 1 = 1
longitud n | even n = 1 + longitud (n `div` 2)
| otherwise = 1 + longitud (3*n+1)
-- 3ª solución (con iterate)
-- =========================
mayorLongitud3 :: Int -> Int -> Int
mayorLongitud3 i j = maximum [length (sucesion2 k) | k <- [i..j]]
-- (sucesion2 n) es la sucesión 3n+1 generada por n. Por ejemplo,
-- sucesion2 22 == [22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1]
sucesion2 :: Int -> [Int]
sucesion2 n = takeWhile (/=1) (iterate f n) ++ [1]
where f x | even x = x `div` 2
| otherwise = 3*x+1 |