La sucesión de Sylvester es la sucesión que comienza en 2 y sus restantes términos se obtienen multiplicando los anteriores y sumándole 1.
Definir las funciones
sylvester :: Integer -> Integer graficaSylvester :: Integer -> Integer -> IO () |
tales que
- (sylvester n) es el n-ésimo término de la sucesión de Sylvester. Por ejemplo,
λ> [sylvester n | n <- [0..7]] [2,3,7,43,1807,3263443,10650056950807,113423713055421844361000443] λ> length (show (sylvester 25)) 6830085 |
- (graficaSylvester d n) dibuja la gráfica de los d últimos dígitos de los n primeros términos de la sucesión de Sylvester. Por ejemplo,
Soluciones
import Data.List (genericIndex) import Data.Array ((!), array) import Graphics.Gnuplot.Simple (plotList, Attribute (Key, PNG)) -- 1ª solución (por recursión) -- =========================== sylvester1 :: Integer -> Integer sylvester1 0 = 2 sylvester1 n = 1 + product [sylvester1 k | k <- [0..n-1]] -- 2ª solución (con programación dinámica) -- ======================================= sylvester2 :: Integer -> Integer sylvester2 n = v ! n where v = array (0,n) [(i,f i) | i <- [0..n]] f 0 = 2 f m = 1 + product [v!k | k <- [0..m-1]] -- 3ª solución -- =========== sylvester3 :: Integer -> Integer sylvester3 0 = 2 sylvester3 n = 1 + x^2 - x where x = sylvester3 (n-1) -- 4ª solución -- =========== sylvester4 :: Integer -> Integer sylvester4 n = v ! n where v = array (0,n) [(i,f i) | i <- [0..n]] f 0 = 2 f m = 1 + x^2 - x where x = v ! (m-1) -- 4ª solución -- =========== sylvester5 :: Integer -> Integer sylvester5 0 = 2 sylvester5 n = 1 + (productosSylvester `genericIndex` (n-1)) sucSylvester5 :: [Integer] sucSylvester5 = map sylvester5 [0..] productosSylvester :: [Integer] productosSylvester = scanl1 (*) sucSylvester5 -- Comparación de eficiencia -- ========================= -- λ> length (show (sylvester1 20)) -- 213441 -- (3.40 secs, 519,249,840 bytes) -- λ> length (show (sylvester2 20)) -- 213441 -- (0.10 secs, 13,716,024 bytes) -- λ> length (show (sylvester3 20)) -- 213441 -- (0.16 secs, 13,646,472 bytes) -- λ> length (show (sylvester4 20)) -- 213441 -- (0.18 secs, 13,654,064 bytes) -- λ> length (show (sylvester5 20)) -- 213441 -- (0.12 secs, 13,497,192 bytes) graficaSylvester :: Integer -> Integer -> IO () graficaSylvester d n = plotList [ Key Nothing , PNG ("La_sucesion_de_Sylvester_" ++ show (d,n) ++ ".png") ] [sylvester5 k `mod` (10^d) | k <- [0..n]] |