Menu Close

Sucesiones suaves

Una sucesión es suave si valor absoluto de la diferencia de sus términos consecutivos es 1.

Definir la función

   suaves :: Int -> [[Int]]

tal que (suaves n) es la lista de las sucesiones suaves de longitud n cuyo último término es 0. Por ejemplo,

   suaves 2  ==  [[1,0],[-1,0]]
   suaves 3  ==  [[2,1,0],[0,1,0],[0,-1,0],[-2,-1,0]]

Soluciones

suaves :: Int -> [[Int]]
suaves 0 = []
suaves 1 = [[0]]
suaves n = concat [[x+1:x:xs,x-1:x:xs] | (x:xs) <- suaves (n-1)]
Medio

6 soluciones de “Sucesiones suaves

  1. antnavoro
    suaves :: Int -> [[Int]]
    suaves = aux [[0]] . pred
      where aux xs 0 = xs
            aux xs n = aux (concatMap ( (y:ys) -> [y+1:y:ys,y-1:y:ys]) xs) $ pred n
  2. josejuan
    suaves 1 = [[0]]                                                    
    suaves n = [-1,1] >>= i -> suaves (n-1) >>= xs@(x:_) -> [(x+i):xs]
    • Chema Cortés

      Otra forma de expresarlo:

      suaves :: Int -> [[Int]]
      suaves 1 = [[0]]
      suaves n = [(x+i):xs | xs@(x:_) <- suaves (n-1), i <- [1,-1]]
  3. josejuan

    Puede calcularse directamente el término (la sucesión) concreta que se desee:

    -- la sucesión i-ésima de entre las n-suaves                              
    suave n i = scanl (a j -> a + if testBit i j then 1 else (-1)) 0 [0..n-2]
     
    suaves n = suave n <$> [0..2^(n-1)-1::Int]
  4. josejuan

    Aunque internamente (operaciones con bits) se itera, se puede calcular el término de cada serie:

    -- el término b-ésimo de la sucesión i-ésima de entre las n-suaves
    suavek n i b = let z = popCount (i .&. (2^b - 1)) in 2 * z - b    
     
    -- la sucesión i-ésima de entre las n-suaves                      
    suave n i = suavek n i <$> [0..n-1]                               
     
    suaves n = suave n <$> [0..2^(n-1)-1::Int]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.