SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Tema 6: Funciones recursivas
Informática (2010–11)
José A. Alonso Jiménez
Grupo de Lógica Computacional
Departamento de Ciencias de la Computación e I.A.
Universidad de Sevilla
IM Tema 6: Funciones recursivas
Tema 6: Funciones recursivas
1. Recursión numérica
2. Recusión sobre lista
3. Recursión sobre varios argumentos
4. Recursión múltiple
5. Recursión mutua
6. Heurísticas para las definiciones recursivas
2 / 30
IM Tema 6: Funciones recursivas
Recursión numérica
Tema 6: Funciones recursivas
1. Recursión numérica
2. Recusión sobre lista
3. Recursión sobre varios argumentos
4. Recursión múltiple
5. Recursión mutua
6. Heurísticas para las definiciones recursivas
3 / 30
IM Tema 6: Funciones recursivas
Recursión numérica
Recursión numérica: El factorial
La función factorial:
factorial :: Integer -> Integer
factorial 0 = 1
factorial (n + 1) = (n + 1) * factorial n
Cálculo:
factorial 3 = 3 * (factorial 2)
= 3 * (2 * (factorial 1))
= 3 * (2 * (1 * (factorial 0)))
= 3 * (2 * (1 * 1))
= 3 * (2 * 1)
= 3 * 2
= 6
4 / 30
IM Tema 6: Funciones recursivas
Recursión numérica
Recursión numérica: El producto
Definición recursiva del producto:
por :: Int -> Int -> Int
m `por` 0 = 0
m `por` (n + 1) = m + (m `por` n)
Cálculo:
3 `por` 2 = 3 + (3 `por` 1)
= 3 + (3 + (3 `por` 0))
= 3 + (3 + 0)
= 3 + 3
= 6
5 / 30
IM Tema 6: Funciones recursivas
Recusión sobre lista
Tema 6: Funciones recursivas
1. Recursión numérica
2. Recusión sobre lista
3. Recursión sobre varios argumentos
4. Recursión múltiple
5. Recursión mutua
6. Heurísticas para las definiciones recursivas
6 / 30
IM Tema 6: Funciones recursivas
Recusión sobre lista
Recursión sobre listas: La función product
Producto de una lista de números:
Prelude
product :: Num a => [a] -> a
product [] = 1
product (n:ns) = n * product ns
Cálculo:
product [7,5,2] = 7 * (product [5,2])
= 7 * (5 * (product [2]))
= 7 * (5 * (2 * (product [])))
= 7 * (5 * (2 * 1))
= 7 * (5 * 2)
= 7 * 10
= 70
7 / 30
IM Tema 6: Funciones recursivas
Recusión sobre lista
Recursión sobre listas: La función length
Longitud de una lista:
Prelude
length :: [a] -> Int
length [] = 0
length (_:xs) = 1 + length xs
Cálculo:
length [2,3,5] = 1 + (length [3,5])
= 1 + (1 + (length [5]))
= 1 + (1 + (1 + (length [])))
= 1 + (1 + (1 + 0))
= 1 + (1 + 1)
= 1 + 2
= 3
8 / 30
IM Tema 6: Funciones recursivas
Recusión sobre lista
Recursión sobre listas: La función reverse
Inversa de una lista:
Prelude
reverse :: [a] -> [a]
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
Cálculo:
reverse [2,5,3] = (reverse [5,3]) ++ [2]
= ((reverse [3]) ++ [5]) ++ [2]
= (((reverse []) ++ [3]) ++ [5]) ++ [2]
= (([] ++ [3]) ++ [5]) ++ [2]
= ([3] ++ [5]) ++ [2]
= [3,5] ++ [2]
= [3,5,2]
9 / 30
IM Tema 6: Funciones recursivas
Recusión sobre lista
Recursión sobre listas: ++
Concatenación de listas:
Prelude
(++) :: [a] -> [a] -> [a]
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
Cálculo:
[1,3,5] ++ [2,4] = 1:([3,5] ++ [2,4])
= 1:(3:([5] ++ [2,4]))
= 1:(3:(5:([] ++ [2,4])))
= 1:(3:(5:[2,4]))
= 1:(3:[5,2,4])
= 1:[3,5,2,4]
= [1,3,5,2,4]
10 / 30
IM Tema 6: Funciones recursivas
Recusión sobre lista
Recursión sobre listas: Inserción ordenada
(inserta e xs) inserta el elemento e en la lista xs delante del
primer elemento de xs mayor o igual que e. Por ejemplo,
inserta 5 [2,4,7,3,6,8,10] [2,4,5,7,3,6,8,10]
inserta :: Ord a => a -> [a] -> [a]
inserta e [] = [e]
inserta e (x:xs) | e <= x = e : (x:xs)
| otherwise = x : inserta e xs
Cálculo:
inserta 4 [1,3,5,7] = 1:(inserta 4 [3,5,7])
= 1:(3:(inserta 4 [5,7]))
= 1:(3:(4:(5:[7])))
= 1:(3:(4:[5,7]))
= [1,3,4,5,7]
11 / 30
IM Tema 6: Funciones recursivas
Recusión sobre lista
Recursión sobre listas: Ordenación por inserción
(ordena_por_insercion xs) es la lista xs ordenada mediante
inserción, Por ejemplo,
ordena_por_insercion [2,4,3,6,3] [2,3,3,4,6]
ordena_por_insercion :: Ord a => [a] -> [a]
ordena_por_insercion [] = []
ordena_por_insercion (x:xs) =
inserta x (ordena_por_insercion xs)
Cálculo:
ordena_por_insercion [7,9,6] =
= inserta 7 (inserta 9 (inserta 6 []))
= inserta 7 (inserta 9 [6])
= inserta 7 [6,9]
= [6,7,9]
12 / 30
IM Tema 6: Funciones recursivas
Recursión sobre varios argumentos
Tema 6: Funciones recursivas
1. Recursión numérica
2. Recusión sobre lista
3. Recursión sobre varios argumentos
4. Recursión múltiple
5. Recursión mutua
6. Heurísticas para las definiciones recursivas
13 / 30
IM Tema 6: Funciones recursivas
Recursión sobre varios argumentos
Recursión sobre varios argumentos: La función zip
Emparejamiento de elementos (la función zip):
Prelude
zip :: [a] -> [b] -> [(a, b)]
zip [] _ = []
zip _ [] = []
zip (x:xs) (y:ys) = (x,y) : zip xs ys
Cálculo:
zip [1,3,5] [2,4,6,8]
= (1,2) : (zip [3,5] [4,6,8])
= (1,2) : ((3,4) : (zip [5] [6,8]))
= (1,2) : ((3,4) : ((5,6) : (zip [] [8])))
= (1,2) : ((3,4) : ((5,6) : []))
= [(1,2),(3,4),(5,6)]
14 / 30
IM Tema 6: Funciones recursivas
Recursión sobre varios argumentos
Recursión sobre varios argumentos: La función drop
Eliminación de elementos iniciales:
Prelude
drop :: Int -> [a] -> [a]
drop 0 xs = xs
drop (n+1) [] = []
drop (n+1) (x:xs) = drop n xs
Cálculo:
drop 2 [5,7,9,4] | drop 5 [1,4]
= drop 1 [7,9,4] | = drop 4 [4]
= drop 0 [9,4] | = drop 1 []
= [9,4] | = []
15 / 30
IM Tema 6: Funciones recursivas
Recursión múltiple
Tema 6: Funciones recursivas
1. Recursión numérica
2. Recusión sobre lista
3. Recursión sobre varios argumentos
4. Recursión múltiple
5. Recursión mutua
6. Heurísticas para las definiciones recursivas
16 / 30
IM Tema 6: Funciones recursivas
Recursión múltiple
Recursión múltiple: La función de Fibonacci
La sucesión de Fibonacci es: 0,1,1,2,3,5,8,13,21,. . . . Sus dos
primeros términos son 0 y 1 y los restantes se obtienen sumando
los dos anteriores.
(fibonacci n) es el n–ésimo término de la sucesión de
Fibonacci. Por ejemplo,
fibonacci 8 21
fibonacci :: Int -> Int
fibonacci 0 = 0
fibonacci 1 = 1
fibonacci (n+2) = fibonacci n + fibonacci (n+1)
17 / 30
IM Tema 6: Funciones recursivas
Recursión múltiple
Recursión múltiple: Ordenación rápida
Algoritmo de ordenación rápida:
ordena :: (Ord a) => [a] -> [a]
ordena [] = []
ordena (x:xs) =
(ordena menores) ++ [x] ++ (ordena mayores)
where menores = [a | a <- xs, a <= x]
mayores = [b | b <- xs, b > x]
18 / 30
IM Tema 6: Funciones recursivas
Recursión mutua
Tema 6: Funciones recursivas
1. Recursión numérica
2. Recusión sobre lista
3. Recursión sobre varios argumentos
4. Recursión múltiple
5. Recursión mutua
6. Heurísticas para las definiciones recursivas
19 / 30
IM Tema 6: Funciones recursivas
Recursión mutua
Recursión mutua: Par e impar
Par e impar por recursión mutua:
par :: Int -> Bool
par 0 = True
par (n+1) = impar n
impar :: Int -> Bool
impar 0 = False
impar (n+1) = par n
Cálculo:
impar 3 | par 3
= par 2 | = impar 2
= impar 1 | = par 1
= par 0 | = impar 0
= True | = False 20 / 30
IM Tema 6: Funciones recursivas
Recursión mutua
Recursión mutua: Posiciones pares e impares
(pares xs) son los elementos de xs que ocupan posiciones pares.
(impares xs) son los elementos de xs que ocupan posiciones
impares.
pares :: [a] -> [a]
pares [] = []
pares (x:xs) = x : impares xs
impares :: [a] -> [a]
impares [] = []
impares (_:xs) = pares xs
Cálculo:
pares [1,3,5,7]
= 1:(impares [3,5,7])
= 1:(pares [5,7])
= 1:(5:(impares [7]))
= 1:(5:[])
= [1,5]
21 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Tema 6: Funciones recursivas
1. Recursión numérica
2. Recusión sobre lista
3. Recursión sobre varios argumentos
4. Recursión múltiple
5. Recursión mutua
6. Heurísticas para las definiciones recursivas
22 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Aplicación del método: La función product
Paso 1: Definir el tipo:
product :: [Int] -> Int
Paso 2: Enumerar los casos:
product :: [Int] -> Int
product [] =
product (n:ns) =
Paso 3: Definir los casos simples:
product :: [Int] -> Int
product [] = 1
product (n:ns) =
23 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Aplicación del método: La función product
Paso 4: Definir los otros casos:
product :: [Int] -> Int
product [] = 1
product (n:ns) = n * product ns
Paso 5: Generalizar y simplificar:
product :: Num a => [a] -> a
product = foldr (*) 1
donde (foldr op e l) pliega por la derecha la lista l
colocando el operador op entre sus elementos y el elemento e al
final. Por ejemplo,
foldr (+) 6 [2,3,5] 2+(3+(5+6)) 16
foldr (-) 6 [2,3,5] 2-(3-(5-6)) -2
24 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Aplicación del método: La función drop
Paso 1: Definir el tipo:
drop :: Int -> [a] -> [a]
Paso 2: Enumerar los casos:
drop :: Int -> [a] -> [a]
drop 0 [] =
drop 0 (x:xs) =
drop (n+1) [] =
drop (n+1) (x:xs) =
25 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Aplicación del método: La función drop
Paso 3: Definir los casos simples:
drop :: Int -> [a] -> [a]
drop 0 [] = []
drop 0 (x:xs) = x:xs
drop (n+1) [] = []
drop (n+1) (x:xs) =
Paso 4: Definir los otros casos:
drop :: Int -> [a] -> [a]
drop 0 [] = []
drop 0 (x:xs) = x:xs
drop (n+1) [] = []
drop (n+1) (x:xs) = drop n xs
26 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Aplicación del método: La función drop
Paso 5: Generalizar y simplificar:
drop :: Integral b => b -> [a] -> [a]
drop 0 xs = xs
drop (n+1) [] = []
drop (n+1) (_:xs) = drop n xs
27 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Aplicación del método: La función init
init elimina el último elemento de una lista no vacía.
Paso 1: Definir el tipo:
init :: [a] -> [a]
Paso 2: Enumerar los casos:
init :: [a] -> [a]
init (x:xs) =
Paso 3: Definir los casos simples:
init :: [a] -> [a]
init (x:xs) | null xs = []
| otherwise =
28 / 30
IM Tema 6: Funciones recursivas
Heurísticas para las definiciones recursivas
Aplicación del método: La función init
Paso 4: Definir los otros casos:
init :: [a] -> [a]
init (x:xs) | null xs = []
| otherwise = x : init xs
Paso 5: Generalizar y simplificar:
init :: [a] -> [a]
init [_] = []
init (x:xs) = x : init xs
29 / 30
IM Tema 6: Funciones recursivas
Bibliografía
Bibliografía
1. R. Bird. Introducción a la programación funcional con Haskell.
Prentice Hall, 2000.
Cap. 3: Números.
Cap. 4: Listas.
2. G. Hutton Programming in Haskell. Cambridge University Press,
2007.
Cap. 6: Recursive functions.
3. B. O’Sullivan, D. Stewart y J. Goerzen Real World Haskell.
O’Reilly, 2008.
Cap. 2: Types and Functions.
4. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando
con Haskell. Thompson, 2004.
Cap. 2: Introducción a Haskell.
Cap. 6: Programación con listas.
5. S. Thompson. Haskell: The Craft of Functional Programming,
Second Edition. Addison-Wesley, 1999.
Cap. 4: Designing and writing programs. 30 / 30

Contenu connexe

Tendances

Ejercicios resueltos diagramas de claseaula (1)
Ejercicios resueltos diagramas de claseaula (1)Ejercicios resueltos diagramas de claseaula (1)
Ejercicios resueltos diagramas de claseaula (1)
William Lozano
 
Prolog ejercicios resueltos
Prolog ejercicios resueltosProlog ejercicios resueltos
Prolog ejercicios resueltos
Jansel M
 
Importancia de las listas Estructura de datos.
Importancia de las listas Estructura de datos.Importancia de las listas Estructura de datos.
Importancia de las listas Estructura de datos.
xaviercamposm
 

Tendances (20)

Estructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busquedaEstructura de Datos - Unidad 6 Metodos de busqueda
Estructura de Datos - Unidad 6 Metodos de busqueda
 
Ejercicios
EjerciciosEjercicios
Ejercicios
 
Arboles Binarios
Arboles BinariosArboles Binarios
Arboles Binarios
 
Recursividad en POO - Java
Recursividad en POO - JavaRecursividad en POO - Java
Recursividad en POO - Java
 
Pilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datosPilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datos
 
Modelo 4+1
Modelo 4+1Modelo 4+1
Modelo 4+1
 
TIPOS DE DATOS PARA C++
TIPOS DE DATOS PARA C++TIPOS DE DATOS PARA C++
TIPOS DE DATOS PARA C++
 
Ejercicios resueltos diagramas de claseaula (1)
Ejercicios resueltos diagramas de claseaula (1)Ejercicios resueltos diagramas de claseaula (1)
Ejercicios resueltos diagramas de claseaula (1)
 
Procesos
ProcesosProcesos
Procesos
 
Dijkstra
DijkstraDijkstra
Dijkstra
 
ESTRUCTURA DE DATOS Pilas y colas.pdf
ESTRUCTURA DE DATOS Pilas y colas.pdfESTRUCTURA DE DATOS Pilas y colas.pdf
ESTRUCTURA DE DATOS Pilas y colas.pdf
 
Estructuras de datos lineales
Estructuras de datos linealesEstructuras de datos lineales
Estructuras de datos lineales
 
Prolog ejercicios resueltos
Prolog ejercicios resueltosProlog ejercicios resueltos
Prolog ejercicios resueltos
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
6 Curso de POO en Java - clases y objetos
6  Curso de POO en Java - clases y objetos6  Curso de POO en Java - clases y objetos
6 Curso de POO en Java - clases y objetos
 
Listas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UPListas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UP
 
Ejercicio parciall 2
Ejercicio parciall 2Ejercicio parciall 2
Ejercicio parciall 2
 
Importancia de las listas Estructura de datos.
Importancia de las listas Estructura de datos.Importancia de las listas Estructura de datos.
Importancia de las listas Estructura de datos.
 
Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
 
Expresiones aritmetica
Expresiones aritmeticaExpresiones aritmetica
Expresiones aritmetica
 

En vedette

Tipos de memoria.
Tipos de memoria.Tipos de memoria.
Tipos de memoria.
camilo199
 
Original Curry
Original CurryOriginal Curry
Original Curry
PATISELE
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
José A. Alonso
 
Exposicion Final Tesis Maestria
Exposicion Final Tesis MaestriaExposicion Final Tesis Maestria
Exposicion Final Tesis Maestria
Jorge Obando
 
MonograEl Perfil y las Funciones del Docente Universitario
MonograEl Perfil y las Funciones del Docente UniversitarioMonograEl Perfil y las Funciones del Docente Universitario
MonograEl Perfil y las Funciones del Docente Universitario
Lic Guillermo Mico
 
65847050 perfil-del-docente-universitario-del-siglo-xxi
65847050 perfil-del-docente-universitario-del-siglo-xxi65847050 perfil-del-docente-universitario-del-siglo-xxi
65847050 perfil-del-docente-universitario-del-siglo-xxi
Bryan Mega Dos
 
Importancia del metodo y las tecnicas de estudio
Importancia del metodo y las tecnicas de estudioImportancia del metodo y las tecnicas de estudio
Importancia del metodo y las tecnicas de estudio
Christian Sanchez
 

En vedette (20)

EJERCICIOS DE RECURSIVIDAD EN HASKELL
EJERCICIOS DE RECURSIVIDAD EN HASKELLEJERCICIOS DE RECURSIVIDAD EN HASKELL
EJERCICIOS DE RECURSIVIDAD EN HASKELL
 
Yesod Framework
Yesod FrameworkYesod Framework
Yesod Framework
 
Tipos de memoria.
Tipos de memoria.Tipos de memoria.
Tipos de memoria.
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
 
Original Curry
Original CurryOriginal Curry
Original Curry
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulas
 
Tema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en HaskellTema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en Haskell
 
Copy - Paste o modificar un trabajo ya elaborado: La nueva competencia del es...
Copy - Paste o modificar un trabajo ya elaborado: La nueva competencia del es...Copy - Paste o modificar un trabajo ya elaborado: La nueva competencia del es...
Copy - Paste o modificar un trabajo ya elaborado: La nueva competencia del es...
 
Indicador estrategias heuristicas
Indicador estrategias heuristicasIndicador estrategias heuristicas
Indicador estrategias heuristicas
 
Mapas graficos
Mapas graficosMapas graficos
Mapas graficos
 
Exposicion Final Tesis Maestria
Exposicion Final Tesis MaestriaExposicion Final Tesis Maestria
Exposicion Final Tesis Maestria
 
Tema 3: Tipos y clases en Haskell
Tema 3: Tipos y clases en HaskellTema 3: Tipos y clases en Haskell
Tema 3: Tipos y clases en Haskell
 
Didáctica expo equipo2
Didáctica expo equipo2Didáctica expo equipo2
Didáctica expo equipo2
 
Objeto virtual de aprendizaje (tablas de multiplicar para niños)
Objeto virtual de aprendizaje (tablas de multiplicar para niños) Objeto virtual de aprendizaje (tablas de multiplicar para niños)
Objeto virtual de aprendizaje (tablas de multiplicar para niños)
 
MonograEl Perfil y las Funciones del Docente Universitario
MonograEl Perfil y las Funciones del Docente UniversitarioMonograEl Perfil y las Funciones del Docente Universitario
MonograEl Perfil y las Funciones del Docente Universitario
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskell
 
65847050 perfil-del-docente-universitario-del-siglo-xxi
65847050 perfil-del-docente-universitario-del-siglo-xxi65847050 perfil-del-docente-universitario-del-siglo-xxi
65847050 perfil-del-docente-universitario-del-siglo-xxi
 
Importancia del metodo y las tecnicas de estudio
Importancia del metodo y las tecnicas de estudioImportancia del metodo y las tecnicas de estudio
Importancia del metodo y las tecnicas de estudio
 
Diplomado (c y tecnol)
Diplomado (c y tecnol)Diplomado (c y tecnol)
Diplomado (c y tecnol)
 

Similaire à Tema 6: Definiciones por recursión en Haskell

Digitalizacion final mat00 2
Digitalizacion final mat00 2Digitalizacion final mat00 2
Digitalizacion final mat00 2
eduardo_andre
 
Curso de Nivelación de Algoritmos - Clase 4
Curso de Nivelación de Algoritmos - Clase 4Curso de Nivelación de Algoritmos - Clase 4
Curso de Nivelación de Algoritmos - Clase 4
Ernesto Mislej
 

Similaire à Tema 6: Definiciones por recursión en Haskell (20)

Tema 10-1x2
Tema 10-1x2Tema 10-1x2
Tema 10-1x2
 
Haskell
HaskellHaskell
Haskell
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con Haskell
 
vectores y matrices2,2.pptx
vectores y matrices2,2.pptxvectores y matrices2,2.pptx
vectores y matrices2,2.pptx
 
Digitalizacion final mat00 2
Digitalizacion final mat00 2Digitalizacion final mat00 2
Digitalizacion final mat00 2
 
Practica i prolog
Practica i prologPractica i prolog
Practica i prolog
 
Tema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellTema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en Haskell
 
Curso de Nivelación de Algoritmos - Clase 4
Curso de Nivelación de Algoritmos - Clase 4Curso de Nivelación de Algoritmos - Clase 4
Curso de Nivelación de Algoritmos - Clase 4
 
Clase 09
Clase 09 Clase 09
Clase 09
 
Pilas Colas
Pilas ColasPilas Colas
Pilas Colas
 
Mat lab03
Mat lab03Mat lab03
Mat lab03
 
Tema 0 Repaso Programación en Java
Tema 0 Repaso Programación en JavaTema 0 Repaso Programación en Java
Tema 0 Repaso Programación en Java
 
Ejercicios Python parte 4
Ejercicios Python parte 4Ejercicios Python parte 4
Ejercicios Python parte 4
 
Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosTema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmos
 
Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.
 
Haskell - Intro
Haskell - IntroHaskell - Intro
Haskell - Intro
 
Comandos r
Comandos rComandos r
Comandos r
 
Simulacro funciones 4_eso
Simulacro funciones 4_esoSimulacro funciones 4_eso
Simulacro funciones 4_eso
 
Pf con scala
Pf con scalaPf con scala
Pf con scala
 
11°letra
11°letra11°letra
11°letra
 

Plus de José A. Alonso

LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
José A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
José A. Alonso
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
José A. Alonso
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
José A. Alonso
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
José A. Alonso
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
José A. Alonso
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
José A. Alonso
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
José A. Alonso
 

Plus de José A. Alonso (20)

Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsqueda
 
I1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosI1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntos
 
Panorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorPanorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenador
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicional
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en Haskell
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicional
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. Aplicaciones
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en Haskell
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer orden
 
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
 

Dernier

PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docx
lupitavic
 
Criterios ESG: fundamentos, aplicaciones y beneficios
Criterios ESG: fundamentos, aplicaciones y beneficiosCriterios ESG: fundamentos, aplicaciones y beneficios
Criterios ESG: fundamentos, aplicaciones y beneficios
JonathanCovena1
 
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
RigoTito
 
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURAFORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
El Fortí
 
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
MiNeyi1
 
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
UPTAIDELTACHIRA
 

Dernier (20)

Unidad 3 | Metodología de la Investigación
Unidad 3 | Metodología de la InvestigaciónUnidad 3 | Metodología de la Investigación
Unidad 3 | Metodología de la Investigación
 
INSTRUCCION PREPARATORIA DE TIRO .pptx
INSTRUCCION PREPARATORIA DE TIRO   .pptxINSTRUCCION PREPARATORIA DE TIRO   .pptx
INSTRUCCION PREPARATORIA DE TIRO .pptx
 
PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docx
 
Abril 2024 - Maestra Jardinera Ediba.pdf
Abril 2024 -  Maestra Jardinera Ediba.pdfAbril 2024 -  Maestra Jardinera Ediba.pdf
Abril 2024 - Maestra Jardinera Ediba.pdf
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptx
 
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
 
Power Point: Fe contra todo pronóstico.pptx
Power Point: Fe contra todo pronóstico.pptxPower Point: Fe contra todo pronóstico.pptx
Power Point: Fe contra todo pronóstico.pptx
 
Criterios ESG: fundamentos, aplicaciones y beneficios
Criterios ESG: fundamentos, aplicaciones y beneficiosCriterios ESG: fundamentos, aplicaciones y beneficios
Criterios ESG: fundamentos, aplicaciones y beneficios
 
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxSEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
 
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
2024 KIT DE HABILIDADES SOCIOEMOCIONALES.pdf
 
origen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioorigen y desarrollo del ensayo literario
origen y desarrollo del ensayo literario
 
CALENDARIZACION DE MAYO / RESPONSABILIDAD
CALENDARIZACION DE MAYO / RESPONSABILIDADCALENDARIZACION DE MAYO / RESPONSABILIDAD
CALENDARIZACION DE MAYO / RESPONSABILIDAD
 
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
 
Qué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativaQué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativa
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...
 
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURAFORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
 
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
 
Dinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dDinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes d
 
PIAR v 015. 2024 Plan Individual de ajustes razonables
PIAR v 015. 2024 Plan Individual de ajustes razonablesPIAR v 015. 2024 Plan Individual de ajustes razonables
PIAR v 015. 2024 Plan Individual de ajustes razonables
 
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
 

Tema 6: Definiciones por recursión en Haskell

  • 1. Tema 6: Funciones recursivas Informática (2010–11) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 6: Funciones recursivas Tema 6: Funciones recursivas 1. Recursión numérica 2. Recusión sobre lista 3. Recursión sobre varios argumentos 4. Recursión múltiple 5. Recursión mutua 6. Heurísticas para las definiciones recursivas 2 / 30
  • 3. IM Tema 6: Funciones recursivas Recursión numérica Tema 6: Funciones recursivas 1. Recursión numérica 2. Recusión sobre lista 3. Recursión sobre varios argumentos 4. Recursión múltiple 5. Recursión mutua 6. Heurísticas para las definiciones recursivas 3 / 30
  • 4. IM Tema 6: Funciones recursivas Recursión numérica Recursión numérica: El factorial La función factorial: factorial :: Integer -> Integer factorial 0 = 1 factorial (n + 1) = (n + 1) * factorial n Cálculo: factorial 3 = 3 * (factorial 2) = 3 * (2 * (factorial 1)) = 3 * (2 * (1 * (factorial 0))) = 3 * (2 * (1 * 1)) = 3 * (2 * 1) = 3 * 2 = 6 4 / 30
  • 5. IM Tema 6: Funciones recursivas Recursión numérica Recursión numérica: El producto Definición recursiva del producto: por :: Int -> Int -> Int m `por` 0 = 0 m `por` (n + 1) = m + (m `por` n) Cálculo: 3 `por` 2 = 3 + (3 `por` 1) = 3 + (3 + (3 `por` 0)) = 3 + (3 + 0) = 3 + 3 = 6 5 / 30
  • 6. IM Tema 6: Funciones recursivas Recusión sobre lista Tema 6: Funciones recursivas 1. Recursión numérica 2. Recusión sobre lista 3. Recursión sobre varios argumentos 4. Recursión múltiple 5. Recursión mutua 6. Heurísticas para las definiciones recursivas 6 / 30
  • 7. IM Tema 6: Funciones recursivas Recusión sobre lista Recursión sobre listas: La función product Producto de una lista de números: Prelude product :: Num a => [a] -> a product [] = 1 product (n:ns) = n * product ns Cálculo: product [7,5,2] = 7 * (product [5,2]) = 7 * (5 * (product [2])) = 7 * (5 * (2 * (product []))) = 7 * (5 * (2 * 1)) = 7 * (5 * 2) = 7 * 10 = 70 7 / 30
  • 8. IM Tema 6: Funciones recursivas Recusión sobre lista Recursión sobre listas: La función length Longitud de una lista: Prelude length :: [a] -> Int length [] = 0 length (_:xs) = 1 + length xs Cálculo: length [2,3,5] = 1 + (length [3,5]) = 1 + (1 + (length [5])) = 1 + (1 + (1 + (length []))) = 1 + (1 + (1 + 0)) = 1 + (1 + 1) = 1 + 2 = 3 8 / 30
  • 9. IM Tema 6: Funciones recursivas Recusión sobre lista Recursión sobre listas: La función reverse Inversa de una lista: Prelude reverse :: [a] -> [a] reverse [] = [] reverse (x:xs) = reverse xs ++ [x] Cálculo: reverse [2,5,3] = (reverse [5,3]) ++ [2] = ((reverse [3]) ++ [5]) ++ [2] = (((reverse []) ++ [3]) ++ [5]) ++ [2] = (([] ++ [3]) ++ [5]) ++ [2] = ([3] ++ [5]) ++ [2] = [3,5] ++ [2] = [3,5,2] 9 / 30
  • 10. IM Tema 6: Funciones recursivas Recusión sobre lista Recursión sobre listas: ++ Concatenación de listas: Prelude (++) :: [a] -> [a] -> [a] [] ++ ys = ys (x:xs) ++ ys = x : (xs ++ ys) Cálculo: [1,3,5] ++ [2,4] = 1:([3,5] ++ [2,4]) = 1:(3:([5] ++ [2,4])) = 1:(3:(5:([] ++ [2,4]))) = 1:(3:(5:[2,4])) = 1:(3:[5,2,4]) = 1:[3,5,2,4] = [1,3,5,2,4] 10 / 30
  • 11. IM Tema 6: Funciones recursivas Recusión sobre lista Recursión sobre listas: Inserción ordenada (inserta e xs) inserta el elemento e en la lista xs delante del primer elemento de xs mayor o igual que e. Por ejemplo, inserta 5 [2,4,7,3,6,8,10] [2,4,5,7,3,6,8,10] inserta :: Ord a => a -> [a] -> [a] inserta e [] = [e] inserta e (x:xs) | e <= x = e : (x:xs) | otherwise = x : inserta e xs Cálculo: inserta 4 [1,3,5,7] = 1:(inserta 4 [3,5,7]) = 1:(3:(inserta 4 [5,7])) = 1:(3:(4:(5:[7]))) = 1:(3:(4:[5,7])) = [1,3,4,5,7] 11 / 30
  • 12. IM Tema 6: Funciones recursivas Recusión sobre lista Recursión sobre listas: Ordenación por inserción (ordena_por_insercion xs) es la lista xs ordenada mediante inserción, Por ejemplo, ordena_por_insercion [2,4,3,6,3] [2,3,3,4,6] ordena_por_insercion :: Ord a => [a] -> [a] ordena_por_insercion [] = [] ordena_por_insercion (x:xs) = inserta x (ordena_por_insercion xs) Cálculo: ordena_por_insercion [7,9,6] = = inserta 7 (inserta 9 (inserta 6 [])) = inserta 7 (inserta 9 [6]) = inserta 7 [6,9] = [6,7,9] 12 / 30
  • 13. IM Tema 6: Funciones recursivas Recursión sobre varios argumentos Tema 6: Funciones recursivas 1. Recursión numérica 2. Recusión sobre lista 3. Recursión sobre varios argumentos 4. Recursión múltiple 5. Recursión mutua 6. Heurísticas para las definiciones recursivas 13 / 30
  • 14. IM Tema 6: Funciones recursivas Recursión sobre varios argumentos Recursión sobre varios argumentos: La función zip Emparejamiento de elementos (la función zip): Prelude zip :: [a] -> [b] -> [(a, b)] zip [] _ = [] zip _ [] = [] zip (x:xs) (y:ys) = (x,y) : zip xs ys Cálculo: zip [1,3,5] [2,4,6,8] = (1,2) : (zip [3,5] [4,6,8]) = (1,2) : ((3,4) : (zip [5] [6,8])) = (1,2) : ((3,4) : ((5,6) : (zip [] [8]))) = (1,2) : ((3,4) : ((5,6) : [])) = [(1,2),(3,4),(5,6)] 14 / 30
  • 15. IM Tema 6: Funciones recursivas Recursión sobre varios argumentos Recursión sobre varios argumentos: La función drop Eliminación de elementos iniciales: Prelude drop :: Int -> [a] -> [a] drop 0 xs = xs drop (n+1) [] = [] drop (n+1) (x:xs) = drop n xs Cálculo: drop 2 [5,7,9,4] | drop 5 [1,4] = drop 1 [7,9,4] | = drop 4 [4] = drop 0 [9,4] | = drop 1 [] = [9,4] | = [] 15 / 30
  • 16. IM Tema 6: Funciones recursivas Recursión múltiple Tema 6: Funciones recursivas 1. Recursión numérica 2. Recusión sobre lista 3. Recursión sobre varios argumentos 4. Recursión múltiple 5. Recursión mutua 6. Heurísticas para las definiciones recursivas 16 / 30
  • 17. IM Tema 6: Funciones recursivas Recursión múltiple Recursión múltiple: La función de Fibonacci La sucesión de Fibonacci es: 0,1,1,2,3,5,8,13,21,. . . . Sus dos primeros términos son 0 y 1 y los restantes se obtienen sumando los dos anteriores. (fibonacci n) es el n–ésimo término de la sucesión de Fibonacci. Por ejemplo, fibonacci 8 21 fibonacci :: Int -> Int fibonacci 0 = 0 fibonacci 1 = 1 fibonacci (n+2) = fibonacci n + fibonacci (n+1) 17 / 30
  • 18. IM Tema 6: Funciones recursivas Recursión múltiple Recursión múltiple: Ordenación rápida Algoritmo de ordenación rápida: ordena :: (Ord a) => [a] -> [a] ordena [] = [] ordena (x:xs) = (ordena menores) ++ [x] ++ (ordena mayores) where menores = [a | a <- xs, a <= x] mayores = [b | b <- xs, b > x] 18 / 30
  • 19. IM Tema 6: Funciones recursivas Recursión mutua Tema 6: Funciones recursivas 1. Recursión numérica 2. Recusión sobre lista 3. Recursión sobre varios argumentos 4. Recursión múltiple 5. Recursión mutua 6. Heurísticas para las definiciones recursivas 19 / 30
  • 20. IM Tema 6: Funciones recursivas Recursión mutua Recursión mutua: Par e impar Par e impar por recursión mutua: par :: Int -> Bool par 0 = True par (n+1) = impar n impar :: Int -> Bool impar 0 = False impar (n+1) = par n Cálculo: impar 3 | par 3 = par 2 | = impar 2 = impar 1 | = par 1 = par 0 | = impar 0 = True | = False 20 / 30
  • 21. IM Tema 6: Funciones recursivas Recursión mutua Recursión mutua: Posiciones pares e impares (pares xs) son los elementos de xs que ocupan posiciones pares. (impares xs) son los elementos de xs que ocupan posiciones impares. pares :: [a] -> [a] pares [] = [] pares (x:xs) = x : impares xs impares :: [a] -> [a] impares [] = [] impares (_:xs) = pares xs Cálculo: pares [1,3,5,7] = 1:(impares [3,5,7]) = 1:(pares [5,7]) = 1:(5:(impares [7])) = 1:(5:[]) = [1,5] 21 / 30
  • 22. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Tema 6: Funciones recursivas 1. Recursión numérica 2. Recusión sobre lista 3. Recursión sobre varios argumentos 4. Recursión múltiple 5. Recursión mutua 6. Heurísticas para las definiciones recursivas 22 / 30
  • 23. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Aplicación del método: La función product Paso 1: Definir el tipo: product :: [Int] -> Int Paso 2: Enumerar los casos: product :: [Int] -> Int product [] = product (n:ns) = Paso 3: Definir los casos simples: product :: [Int] -> Int product [] = 1 product (n:ns) = 23 / 30
  • 24. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Aplicación del método: La función product Paso 4: Definir los otros casos: product :: [Int] -> Int product [] = 1 product (n:ns) = n * product ns Paso 5: Generalizar y simplificar: product :: Num a => [a] -> a product = foldr (*) 1 donde (foldr op e l) pliega por la derecha la lista l colocando el operador op entre sus elementos y el elemento e al final. Por ejemplo, foldr (+) 6 [2,3,5] 2+(3+(5+6)) 16 foldr (-) 6 [2,3,5] 2-(3-(5-6)) -2 24 / 30
  • 25. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Aplicación del método: La función drop Paso 1: Definir el tipo: drop :: Int -> [a] -> [a] Paso 2: Enumerar los casos: drop :: Int -> [a] -> [a] drop 0 [] = drop 0 (x:xs) = drop (n+1) [] = drop (n+1) (x:xs) = 25 / 30
  • 26. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Aplicación del método: La función drop Paso 3: Definir los casos simples: drop :: Int -> [a] -> [a] drop 0 [] = [] drop 0 (x:xs) = x:xs drop (n+1) [] = [] drop (n+1) (x:xs) = Paso 4: Definir los otros casos: drop :: Int -> [a] -> [a] drop 0 [] = [] drop 0 (x:xs) = x:xs drop (n+1) [] = [] drop (n+1) (x:xs) = drop n xs 26 / 30
  • 27. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Aplicación del método: La función drop Paso 5: Generalizar y simplificar: drop :: Integral b => b -> [a] -> [a] drop 0 xs = xs drop (n+1) [] = [] drop (n+1) (_:xs) = drop n xs 27 / 30
  • 28. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Aplicación del método: La función init init elimina el último elemento de una lista no vacía. Paso 1: Definir el tipo: init :: [a] -> [a] Paso 2: Enumerar los casos: init :: [a] -> [a] init (x:xs) = Paso 3: Definir los casos simples: init :: [a] -> [a] init (x:xs) | null xs = [] | otherwise = 28 / 30
  • 29. IM Tema 6: Funciones recursivas Heurísticas para las definiciones recursivas Aplicación del método: La función init Paso 4: Definir los otros casos: init :: [a] -> [a] init (x:xs) | null xs = [] | otherwise = x : init xs Paso 5: Generalizar y simplificar: init :: [a] -> [a] init [_] = [] init (x:xs) = x : init xs 29 / 30
  • 30. IM Tema 6: Funciones recursivas Bibliografía Bibliografía 1. R. Bird. Introducción a la programación funcional con Haskell. Prentice Hall, 2000. Cap. 3: Números. Cap. 4: Listas. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 6: Recursive functions. 3. B. O’Sullivan, D. Stewart y J. Goerzen Real World Haskell. O’Reilly, 2008. Cap. 2: Types and Functions. 4. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 2: Introducción a Haskell. Cap. 6: Programación con listas. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. Addison-Wesley, 1999. Cap. 4: Designing and writing programs. 30 / 30