introalg:taller07_3
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| introalg:taller07_3 [2007/04/20 16:28] – curry de los parametros nicolasw | introalg:taller07_3 [2025/11/15 13:47] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 35: | Línea 35: | ||
| factorial :: Int -> Int | factorial :: Int -> Int | ||
| factorial 0 = 1 -- caso base | factorial 0 = 1 -- caso base | ||
| - | factorial (n+1) = n * factorial | + | factorial (n+1) = (n+1) * factorial n -- caso inductivo |
| </ | </ | ||
| Línea 68: | Línea 68: | ||
| < | < | ||
| - | fib n = fib (n-1) + fib (n-2) | + | fib (n+2) = fib (n+1) + fib n |
| </ | </ | ||
| Línea 104: | Línea 104: | ||
| [False, | [False, | ||
| </ | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| ==== Aplicar (Map) ==== | ==== Aplicar (Map) ==== | ||
| Línea 113: | Línea 117: | ||
| < | < | ||
| duplicar :: [Int] -> [Int] | duplicar :: [Int] -> [Int] | ||
| - | duplicar [] = [] | + | duplicar [] |
| duplicar (x:xs) = 2*x : xs | duplicar (x:xs) = 2*x : xs | ||
| </ | </ | ||
| - | En este caso, la función no se llama a sí misma, así que sólo se aplicaría a la cabeza de la lista, y no a todo el resto. | + | Probamos la función y obtenemos |
| + | |||
| + | Main> duplicar [] | ||
| + | [] | ||
| + | Main> duplicar [10] | ||
| + | [20] | ||
| + | Main> duplicar [10,20] | ||
| + | [20,20] | ||
| + | Main> duplicar [10, | ||
| + | [20, | ||
| + | |||
| + | En este caso, la función | ||
| + | Corregimos este error. | ||
| < | < | ||
| duplicar :: [Int] -> [Int] | duplicar :: [Int] -> [Int] | ||
| - | duplicar [] = [] | + | duplicar [] |
| duplicar (x:xs) = 2*x : duplicar (x: | duplicar (x:xs) = 2*x : duplicar (x: | ||
| </ | </ | ||
| + | |||
| + | Probamos de nuevo la definición y obtenemos | ||
| + | |||
| + | Main> duplicar [] | ||
| + | [] | ||
| + | Main> duplicar [10] | ||
| + | [20, | ||
| En este caso, el caso recursivo no modifica su condición de aplicación, | En este caso, el caso recursivo no modifica su condición de aplicación, | ||
| Línea 131: | Línea 154: | ||
| < | < | ||
| duplicar :: [Int] -> [Int] | duplicar :: [Int] -> [Int] | ||
| - | duplicar [] = [] -- caso base | + | duplicar [] |
| duplicar (x:xs) = 2*x : duplicar xs -- caso inductivo | duplicar (x:xs) = 2*x : duplicar xs -- caso inductivo | ||
| </ | </ | ||
| + | |||
| + | La probamos. | ||
| + | |||
| + | Main> duplicar [10,20] | ||
| + | [20,40] | ||
| + | Main> duplicar [10,20,30] | ||
| + | [20,40,60] | ||
| + | Main> duplicar [1..10] | ||
| + | [2, | ||
| + | Main> duplicar [0..10] | ||
| + | [0, | ||
| + | |||
| Notar que en las funciones de tipo " | Notar que en las funciones de tipo " | ||
| + | |||
| + | |||
| + | |||
| ==== Acumular (Fold) ==== | ==== Acumular (Fold) ==== | ||
| Línea 143: | Línea 181: | ||
| < | < | ||
| sumatoria :: [Int] -> Int | sumatoria :: [Int] -> Int | ||
| - | sumatoria [] = 0 | + | sumatoria [] |
| sumatoria (x:xs) = x + sumatoria xs | sumatoria (x:xs) = x + sumatoria xs | ||
| </ | </ | ||
| Notar que en las funciones de tipo " | Notar que en las funciones de tipo " | ||
| + | |||
| + | Probamos en algunos valores de entrada. | ||
| + | |||
| + | Main> sumatoria [] | ||
| + | 0 | ||
| + | Main> sumatoria [0] | ||
| + | 0 | ||
| + | Main> sumatoria [0,0] | ||
| + | 0 | ||
| + | Main> sumatoria [1..3] | ||
| + | 6 | ||
| + | Main> sumatoria [1..10] | ||
| + | 55 | ||
| + | Main> sumatoria [1..10000] | ||
| + | 50005000 | ||
| ==== Seleccionar (Filter) ==== | ==== Seleccionar (Filter) ==== | ||
| Línea 161: | Línea 214: | ||
| Notar que en las funciones de tipo " | Notar que en las funciones de tipo " | ||
| + | |||
| + | Veamos como funciona. | ||
| + | |||
| + | Main> empiezaM [" | ||
| + | [" | ||
| + | Main> empiezaM [" | ||
| + | [] | ||
| + | |||
| + | ==== Múltiples casos base ==== | ||
| + | |||
| + | Recordemos que el número de casos base depende del problema concreto que estemos tratando. En la Sucesión de Fibonacci, encontramos dos casos base: fib 0 = 1 y fib 1 = 1. En la mayor parte de casos con listas tenemos un solo caso base, el de la lista vacía [], pero para algunos problemas podemos necesitar 2 o más casos base. Veamos por ejemplo la función // | ||
| + | |||
| + | < | ||
| + | emparejar :: [String] -> [(String, | ||
| + | emparejar (x:y:xs) = (x,y) : emparejar xs | ||
| + | emparejar [x] = [(x,x)] | ||
| + | emparejar [] = [] | ||
| + | </ | ||
| + | |||
| + | Veamos cómo funciona. | ||
| + | |||
| + | Main> emparejar [" | ||
| + | [(" | ||
| + | |||
| ===== Ejercicios ===== | ===== Ejercicios ===== | ||
| Línea 166: | Línea 243: | ||
| === Aplicar === | === Aplicar === | ||
| - | * Definir la función // | + | * Definir la función // |
| probar con [345, | probar con [345, | ||
| - | * Generalizar la función // | + | * Generalizar la función // |
| * Generalizar la función // | * Generalizar la función // | ||
| Línea 199: | Línea 276: | ||
| === Miscelánea === | === Miscelánea === | ||
| - | * Escribir la función que calcula la Sucesión de Fibonacci, //fib.n//, //fib : Int -> Int//, que se define así: //fib(n) = fib(n-1) + fib(n-2)//. | + | * Escribir la función que calcula la Sucesión de Fibonacci, //fib.n//, //fib : Int -> Int//, que se define así: //fib (n+2) = fib (n+1) + fib n//. |
| probar con 4, 3, 2, 1 y 0. | probar con 4, 3, 2, 1 y 0. | ||
| Línea 207: | Línea 284: | ||
| probar con [(1,1)], [] y [(2, | probar con [(1,1)], [] y [(2, | ||
| - | * Definir la función // | + | * Definir la función // |
| probar con [0], [], [1], [0,0,0,0], [0,1,0,1], [1,2,3], [' | probar con [0], [], [1], [0,0,0,0], [0,1,0,1], [1,2,3], [' | ||
| Línea 214: | Línea 291: | ||
| probar con [], [0,0,0,0], [1,2,3,4], [0] y [1,5,7,0,9] | probar con [], [0,0,0,0], [1,2,3,4], [0] y [1,5,7,0,9] | ||
| + | |||
| + | * Definir la función // | ||
| + | |||
| + | probar con 8 y " | ||
| * Definir la función // | * Definir la función // | ||
introalg/taller07_3.1177097283.txt.gz · Última modificación: (editor externo)
