Menu Close

Sucesión duplicadora

Para cada entero positivo n, existe una única sucesión que empieza en 1, termina en n y en la que cada uno de sus elementos es el doble de su anterior o el doble más uno. Dicha sucesión se llama la sucesión duplicadora de n. Por ejemplo, la sucesión duplicadora de 13 es [1, 3, 6, 13], ya que

    3 = 2*1 +1
    6 = 2*3
   13 = 2*6 +1

Definir la función

   duplicadora :: Integer -> [Integer]

tal que (duplicadora n) es la sucesión duplicadora de n. Por ejemplo,

   duplicadora 13                   ==  [1,3,6,13]
   duplicadora 17                   ==  [1,2,4,8,17]
   length (duplicadora (10^40000))  ==  132878

Soluciones

-- 1ª definición
duplicadora :: Integer -> [Integer]
duplicadora x =
  reverse (takeWhile (>=1) (iterate (`div` 2) x))
 
-- 2ª definición
duplicadora2 :: Integer -> [Integer]
duplicadora2  =
  reverse . takeWhile (>=1) . iterate (`div` 2)

5 soluciones de “Sucesión duplicadora

  1. margomnot
    import Data.List
     
    duplicadora :: Integer -> [Integer]
    duplicadora n = reverse $ takeWhile (/=0) (iterate (`div` 2) n)
  2. rafpueleo
     
    duplicadora :: Integer -> [Integer]
    duplicadora x =  reverse (aux x ++ [1])
      where aux 1 = []
            aux x | (x `div` 2) `elem` xs = [x] ++ aux (x `div` 2)
                         |((x `div` 2)+1) `elem` xs = [x] ++ aux ((x `div` 2)+1)
                          |otherwise = aux (x-1)
     
            xs = [n | n <- [1..x]]
  3. melgonaco
    duplicadora :: Integer -> [Integer]
    duplicadora = reverse . duplicadora'
     
    duplicadora' :: Integer -> [Integer]
    duplicadora' 1 = [1]
    duplicadora' n = n : duplicadora' (div n 2)
  4. fercarnav
    import Control.Monad
     
    data Arbol a = H a
                 | N a (Arbol a) (Arbol a)
                 deriving (Show, Eq)
     
     
    duplicadora :: Integer -> [Integer]
    duplicadora n= concat (subeArbol (duplicaArbol n (H 1)))
     
    duplicaArbol :: Integer ->  Arbol Integer-> Arbol Integer
    duplicaArbol n (H a)
      | a > n = H 0
      | a == n = H n
      | otherwise = duplicaArbol n (N a (H (2*a)) (H (2*a+1)))
    duplicaArbol n (N a i d) = N a (duplicaArbol n i) (duplicaArbol n d)
     
    subeArbol :: Arbol Integer -> [[Integer]]
    subeArbol (H a)
      | a /= 0 = [[a]]
      | otherwise = []
    subeArbol (N a i d) = map (a:) ((subeArbol i) ++ (subeArbol d))
  5. Enrique Zubiría
    duplicadora :: Integer -> [Integer]
    duplicadora n = reverse rs
      where rs = n:f n
            f m | m == 1 = []
                | otherwise = m2:f m2
                where m2 = div m 2

Leave a Reply to Enrique Zubiría Cancel reply

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