Mayor sucesión del problema 3n+1
La sucesión 3n+1 generada por un número entero positivo x es sucesión generada por el siguiente algoritmo: Se empieza con el número x. Si x es par, se divide entre 2. Si x es impar, se multiplica por 3 y se le suma 1. El proceso se repite con el número obtenido hasta que se alcanza el valor 1. Por ejemplo, la sucesión de números generadas cuando se empieza en 22 es
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Se ha conjeturado (aunque no demostrado) que este algoritmo siempre alcanza el 1 empezando en cualquier entero positivo.
Definir la función
mayorLongitud :: Integer -> Integer -> Integer
tal que (mayorLongitud i j) es el máximo de las longitudes de las sucesiones 3n+1 para todos los números comprendidos entre i y j, ambos inclusives. Por ejemplo,
mayorLongitud 1 10 == 20 mayorLongitud 100 200 == 125 mayorLongitud 201 210 == 89 mayorLongitud 900 1000 == 174
Soluciones
-- 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