Edición de «Práctica 1 (Paradigmas)»

De Cuba-Wiki
Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.

Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces publica los cambios para así efectuar la reversión.

Revisión actual Tu texto
Línea 42: Línea 42:
  uncurry2 :: (a -> b -> c) -> (a,b) -> c
  uncurry2 :: (a -> b -> c) -> (a,b) -> c
  uncurry2 f (a,b) = f a b
  uncurry2 f (a,b) = f a b
== Ejercicio 3 ==
[1,1,2]


== Ejercicio 4 ==
== Ejercicio 4 ==
  pitagóricas :: [(Integer,Integer,Integer)]
  pitagóricas :: [(Integer,Integer,Integer)]
  pitagóricas = [(a,b,c) | a <- [1..], b <-[1..], c <- [1..], a^2 + b^2 == c^2]
  pitagóricas = [(a,b,c) | a <- [1..], b <-[1..], c <- [1..], a^2 + b^2 == c^2]
Se cuelga en (1, 1, inf)


  pitagóricas1 = [(a,b,c) | a <- [1..], b <- [1..(a^2)], c <- [1..(a^2 + b^2)], a^2 + b^2 == c^2]
  pitagóricas' = [(a,b,c) | a <- [1..], b <-[1..(a^2)], c <- [1..(a^2 + b^2)], a^2 + b^2 == c^2]
 
pitagóricas2 = [(a,b,c) | c <- [1..], a <- [1..c^2], b <- [1..c^2], a^2 + b^2 == c^2]


== Ejercicio 5 ==
== Ejercicio 5 ==
  primos :: [Integer]
  primos :: [Integer]
  primos = take 1000 allPrimes
  primos = take 75 allPrimes
  allPrimes :: [Integer]
  allPrimes :: [Integer]
  allPrimes = [x | x <- [1..], length (divisores x) == 2]
  allPrimes = [x | x <- [1..], length (divisores x) == 2]
Línea 63: Línea 57:


== Ejercicio 6 ==
== Ejercicio 6 ==
partir :: [a] -> [([a],[a])]
partir :: [a] -> [([a],[a])]
partir xs = [p | i <- [0..length xs], p <- [splitAt i xs]]
partir xs = [p | i <- [0..length xs], p <- [splitAt i xs]]
 
(bis)
 
partir :: [a] -> [([a],[a])]
partir xs = [(take i xs,drop i xs)|i<-[0..length xs]]


== Ejercicio 7 ==
== Ejercicio 7 ==
  listasQueSuman :: Int -> [ [Int] ]
  listasQueSuman :: Int -> [[Int]]
listasQueSuman 0 = [[]]
listasQueSuman n = [(x:xs) | x<-[1..n],xs<-listasQueSuman (n-x)]


== Ejercicio 8 ==
== Ejercicio 8 ==
  listasPositivas :: [ [Int] ]
  listasPositivas :: [[Int]]
listasPositivas = [xs | n<-[0..], xs<-listasQueSuman n]


== Ejercicio 9 ==
== Ejercicio 9 ==
Línea 93: Línea 79:
  filter2 :: (a -> Bool) -> [a] -> [a]
  filter2 :: (a -> Bool) -> [a] -> [a]
  filter2 f xs = foldr (\x -> concat_if (f x) x) [] xs
  filter2 f xs = foldr (\x -> concat_if (f x) x) [] xs
   where concat_if f = if f then (:) else (\_ -> id)
   where concat_if f = if f then (:) else (\_ -> \xs -> xs)


  map2 :: (a -> b) -> [a] -> [b]
  map2 :: (a -> b) -> [a] -> [b]
Línea 104: Línea 90:
  foldalt :: (a -> b -> b) -> (a -> b -> b) -> b -> [a] -> b
  foldalt :: (a -> b -> b) -> (a -> b -> b) -> b -> [a] -> b
  foldalt _ _ b [] = b
  foldalt _ _ b [] = b
  foldalt f g b (x:xs) = g x (foldalt g f b xs) OJO: USA RECURSIÓN EXPLÍCITA
  foldalt f g b (x:xs) = g x (foldalt g f b xs)


(bis)
(bis)
  sumaAlt :: [Integer] -> Integer
  sumaAlt :: [Integer] -> Integer
  sumaAlt = foldr (-) 0
  sumaAlt = foldr (-) 0
=== III ===
sumaAlt2:: [Integer] -> Integer
sumaAlt2 xs = foldr (-) 0 (reverse xs)


== Ejercicio 10 ==
== Ejercicio 10 ==
Línea 126: Línea 108:
               (\pref x -> pref ++ [(pref !! (length pref - 1)) ++ [x]])
               (\pref x -> pref ++ [(pref !! (length pref - 1)) ++ [x]])
               [[]]
               [[]]
bis
prefijos :: [a] -> [[a]]
prefijos xs = [take i xs | i<-[0..length xs]]


=== III ===
=== III ===
Línea 146: Línea 122:
                 (\x suf -> prefijos x ++ suf)
                 (\x suf -> prefijos x ++ suf)
                 [[]]
                 [[]]
(bis)
sufijos :: [a] -> [[a]]
sufijos xs = [drop i xs | i<-[0..length xs]]
sublistas :: Eq a => [a] -> [[a]]
sublistas xs = [] : filter (/= []) (concatMap prefijos (sufijos xs))
(bis bis)
sublistas:: Eq a => [a] -> [ [a] ]
sublistas xs = nub [take i (drop j xs) | j <-[0..length xs], i <-[0..length xs]]


== Ejercicio 11 ==
== Ejercicio 11 ==
Línea 164: Línea 127:
  sacarUna :: Eq a => a -> [a] -> [a]
  sacarUna :: Eq a => a -> [a] -> [a]
  sacarUna x xs = fst(break (==x) xs) ++ tail(snd(break (==x) xs))
  sacarUna x xs = fst(break (==x) xs) ++ tail(snd(break (==x) xs))
=== II ===
permutaciones :: Eq a=>[a]->[[a]]
permutaciones [] = [[]]
permutaciones xs = [x:xs2 | x<-xs, xs2<-(permutaciones (sacarUna x xs))]
=== Solución alternativa, sin recursión explícita ===
permutaciones :: [Char] -> [ [ Char ] ]
permutaciones l = foldr (\head acum -> (concatMap (\perm -> [ (take i perm) ++ [head] ++ (drop i perm) | i <- [0..(length perm)] ]) acum)) [[]] l


== Ejercicio 12 ==
== Ejercicio 12 ==
Línea 192: Línea 146:


=== II ===
=== II ===
Incorrecto:
  armarPares :: [a] -> [a] -> [(a,a)]
  armarPares :: [a] -> [a] -> [(a,a)]
  armarPares = foldr
  armarPares = foldr
                 (\a armarAs (b:bs) -> (a,b):armarAs bs)
                 (\a armarAs (b:bs) -> (a,b):armarAs bs)
                (const [])
Problema: El codigo anterior no admite el caso armarPares _ []
Solucion:
armarPares :: [a] -> [a] -> [(a,a)]
armarPares = foldr
                (\a armarAs bs -> if null bs
                                  then []
                                  else (a,head bs):armarAs (tail bs) )
                 (const [])
                 (const [])


Línea 217: Línea 161:
             (\f1 sumarM1 (f2:m2) -> (zipWith (+) f1 f2) : sumarM1 m2)
             (\f1 sumarM1 (f2:m2) -> (zipWith (+) f1 f2) : sumarM1 m2)
             (const [])
             (const [])
(bis)
sumaMat :: [[Int]] -> [[Int]] -> [[Int]]
sumaMat=zipWith (zipWith (+))


=== II ===
=== II ===
  trasponer :: [[a]] -> [[a]]
  trasponer :: [[Int]] -> [[Int]]
  trasponer [] = []
  trasponer [] = []
  trasponer ([]:m) = trasponer m
  trasponer ([]:m) = trasponer m
Línea 230: Línea 169:
     (h : [hi | (hi:fi) <- m])            == Unir cabezas de filas
     (h : [hi | (hi:fi) <- m])            == Unir cabezas de filas
     : trasponer (f : [fi | (hi:fi) <- m]) == Continuar trasponiendo matriz (sin cabezas)
     : trasponer (f : [fi | (hi:fi) <- m]) == Continuar trasponiendo matriz (sin cabezas)
(bis)
trasponer :: [[a]] -> [[a]]
trasponer mat = if null mat then [] else foldr (zipWith (:)) vacías mat
                where vacías = map (const []) (head mat)
(Usando zipWithList)
trasponer ::[[a]]->[[a]]
trasponer = zipWithList (:) []
=== III ===
zipWithList::(a->b->b)->b->[[a]]->[b]
zipWithList f c = foldr (\x y-> if null y then map (flip f c) x else zipWith f x y) []
(Usando trasponer)
zipWithList::(a->b->b)->b->[[a]]->[b]
zipWithList f base xss = map (foldr f base) (trasponer xss)


== Ejercicio 16  ==
== Ejercicio 16  ==
Línea 298: Línea 216:
=== I ===
=== I ===
  foldNat :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
  foldNat :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
  foldNat f x 0 = x
  foldNat f x 1 = x
  foldNat f x n = f x (foldNat f x (n-1))
  foldNat f x n = f x (foldNat f x (n-1))


=== II ===
=== II ===
  potencia :: Integer -> Integer -> Integer
  potencia :: Integer -> Integer -> Integer
  potencia x = foldNat (\y res-> x * res) 1
  potencia = foldNat (*)


== Ejercicio 18 ==
== Ejercicio 18 ==
Línea 326: Línea 244:


=== I ===
=== I ===
  vacío :: Conj a
  empty :: Conj a
  vacío = const False
  empty = const False


  agregar :: Eq a => a -> Conj a -> Conj a
  add :: Eq a => a -> Conj a -> Conj a
  agregar x c = \y -> (x == y || (c y))
  add x c = \y -> (if x == y then True else c y)


=== II ===
=== II ===
Línea 348: Línea 266:


=== IV ===
=== IV ===
  primeraAparición::a->[Conj a]->Int
  prim :: a -> [Conj a] -> Int
  primeraAparición e xs = head ([i|i<-[0..],(xs!!i) e])
  prim x cs = primi x cs 1
-- prim 3 [(add 2 (add 3 empty)), (add 4 (add 5 empty))]
 
primi :: a -> [Conj a] -> Int -> Int
primi _ [] _ = 0
primi x (c:cs) i = if c x then i else primi x cs (i+1)
 


== Ejercicio 20 ==
== Ejercicio 20 ==
Línea 411: Línea 335:
  nodos = foldAB 0 (\a x b -> 1 + a + b)
  nodos = foldAB 0 (\a x b -> 1 + a + b)


-- Éste está mal
  hojas :: AB a -> Int
  hojas :: AB a -> Int
  hojas = foldAB 0 (\a x -> (+1))
  hojas = foldAB 0 (\a x -> (+1))
Ten en cuenta que todas las contribuciones a Cuba-Wiki pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase Cuba-Wiki:Derechos de autor para más detalles). ¡No uses textos con copyright sin permiso!

Para editar esta página, responde la pregunta que aparece abajo (más información):

Cancelar Ayuda de edición (se abre en una ventana nueva)

Plantillas usadas en esta página: