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 19:28] – curry de los parametros nicolasw | introalg:taller07_3 [2018/08/10 03:03] (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: 2018/08/10 03:03 (editor externo)