Sucesión triangular
La sucesión triangular es la obtenida concatenando las listas [1], [1,2], [1,2,3], [1,2,3,4], .... Sus primeros términos son 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, ...
Definir las funciones
sucTriangular :: [Integer] terminoSucTriangular :: Int -> Integer graficaSucTriangular :: Int -> IO ()
tales que
- sucTriangular es la lista de los términos de la sucesión triangular. Por ejemplo,
λ> take 30 sucTriangular [1,1,2,1,2,3,1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7,1,2]
- (terminoSucTriangular n) es el término n-ésimo de la sucesión triangular. Por ejemplo,
terminoSucTriangular 5 == 3 terminoSucTriangular 10 == 1 terminoSucTriangular 20 == 6 terminoSucTriangular 100 == 10 terminoSucTriangular 1001 == 12 terminoSucTriangular (10^5) == 320
- (graficaSucTriangular n) dibuja la gráfica de los n primeros términos de la sucesión triangular. Por ejemplo, (graficaSucTriangular 300) dibuja
"
Soluciones
import Test.QuickCheck import Graphics.Gnuplot.Simple -- 1ª definición de sucTriangular -- ============================== sucTriangular :: [Integer] sucTriangular = concat [[1..n] | n <- [1..]] -- 2ª definición de sucTriangular -- ============================== sucTriangular2 :: [Integer] sucTriangular2 = [x | n <- [1..], x <- [1..n]] -- 1ª definición de terminoSucTriangular -- ===================================== terminoSucTriangular :: Int -> Integer terminoSucTriangular k = sucTriangular !! k -- 2ª definición de terminoSucTriangular -- ===================================== terminoSucTriangular2 :: Int -> Integer terminoSucTriangular2 k = sucTriangular2 !! k -- Equivalencia de definiciones -- ============================ -- La propiedad es prop_terminoTriangular :: Positive Int -> Bool prop_terminoTriangular (Positive n) = terminoSucTriangular n == terminoSucTriangular2 n -- La comprobación es -- λ> quickCheck prop_terminoTriangular -- +++ OK, passed 100 tests. -- Comparación de eficiencia -- ========================= -- λ> terminoSucTriangular (10^6) -- 1010 -- (0.35 secs, 128,456,048 bytes) -- λ> terminoSucTriangular2 (10^6) -- 1010 -- (0.72 secs, 144,372,232 bytes) -- Definición de graficaSucTriangular -- ================================== graficaSucTriangular :: Int -> IO () graficaSucTriangular n = plotList [ Key Nothing , PNG ("Sucesion_triangular.png") ] (take n sucTriangular)