SlideShare una empresa de Scribd logo
5
Lo más leído
8
Lo más leído
21
Lo más leído
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

Más contenido relacionado

PDF
Tema 3: Tipos y clases en Haskell
PDF
Tema 9: Declaraciones de tipos y clases en Haskell
PDF
EJERCICIOS DE RECURSIVIDAD EN HASKELL
PPT
POO: Herencia, Abstraccion y Polimorfismo
PPTX
EJEMPLOS DE CLASES Y HERENCIAS
PPTX
Polimorfismo en Java
PPTX
Vistas en mySql
PPTX
Pilas y colas
Tema 3: Tipos y clases en Haskell
Tema 9: Declaraciones de tipos y clases en Haskell
EJERCICIOS DE RECURSIVIDAD EN HASKELL
POO: Herencia, Abstraccion y Polimorfismo
EJEMPLOS DE CLASES Y HERENCIAS
Polimorfismo en Java
Vistas en mySql
Pilas y colas

La actualidad más candente (20)

PPTX
Estructura de datos 2 corte
PDF
¿Cómo realizar entrevistas eficaces para obtener requisitos de software?
PDF
Presentacion Python
PPTX
Python Programming | JNTUA | UNIT 2 | Fruitful Functions |
PPTX
operator overloading & type conversion in cpp over view || c++
PPTX
Packages In Python Tutorial
PPTX
Java Stack Data Structure.pptx
PPTX
Metodos de ordenacion radix sort
PDF
Python lambda functions with filter, map & reduce function
PPTX
Programación 3: listas enlazadas
PPTX
Inheritance in c++
PDF
Function Call Stack
PDF
Ejercicios resueltos en el Laboratorio de estructuras struct registros
PPTX
JAVA LOOP.pptx
PPTX
Paradigma Programación Orientada a Objetos (POO)
PDF
9 Curso de POO en java - variables, constantes y objetos
PPTX
PPTX
Python-Inheritance.pptx
DOC
Ejemplo plan de desarrollo de software rup
PPT
Excepciones en java
Estructura de datos 2 corte
¿Cómo realizar entrevistas eficaces para obtener requisitos de software?
Presentacion Python
Python Programming | JNTUA | UNIT 2 | Fruitful Functions |
operator overloading & type conversion in cpp over view || c++
Packages In Python Tutorial
Java Stack Data Structure.pptx
Metodos de ordenacion radix sort
Python lambda functions with filter, map & reduce function
Programación 3: listas enlazadas
Inheritance in c++
Function Call Stack
Ejercicios resueltos en el Laboratorio de estructuras struct registros
JAVA LOOP.pptx
Paradigma Programación Orientada a Objetos (POO)
9 Curso de POO en java - variables, constantes y objetos
Python-Inheritance.pptx
Ejemplo plan de desarrollo de software rup
Excepciones en java
Publicidad

Destacado (20)

PDF
I1M2011-T4: Definición de funciones en Haskell
PDF
Yesod Framework
ODP
Tipos de memoria.
PPTX
Bt haskell-1
PPT
Original Curry
PDF
LI -T5: Resolución proposicional
PDF
LI2011-T9: Formas normales de Skolem y cláusulas
PDF
Tema 7: Funciones de orden superior en Haskell
PPTX
Copy - Paste o modificar un trabajo ya elaborado: La nueva competencia del es...
PDF
Indicador estrategias heuristicas
PDF
Mapas graficos
PPT
Exposicion Final Tesis Maestria
PPTX
Didáctica expo equipo2
PPTX
Objeto virtual de aprendizaje (tablas de multiplicar para niños)
DOC
MonograEl Perfil y las Funciones del Docente Universitario
PDF
Programación funcional con haskell
PPTX
65847050 perfil-del-docente-universitario-del-siglo-xxi
PPTX
Importancia del metodo y las tecnicas de estudio
PPT
Diplomado (c y tecnol)
PDF
8. Evaluación Heurística (HCI 1)
I1M2011-T4: Definición de funciones en Haskell
Yesod Framework
Tipos de memoria.
Bt haskell-1
Original Curry
LI -T5: Resolución proposicional
LI2011-T9: Formas normales de Skolem y cláusulas
Tema 7: Funciones de orden superior en Haskell
Copy - Paste o modificar un trabajo ya elaborado: La nueva competencia del es...
Indicador estrategias heuristicas
Mapas graficos
Exposicion Final Tesis Maestria
Didáctica expo equipo2
Objeto virtual de aprendizaje (tablas de multiplicar para niños)
MonograEl Perfil y las Funciones del Docente Universitario
Programación funcional con haskell
65847050 perfil-del-docente-universitario-del-siglo-xxi
Importancia del metodo y las tecnicas de estudio
Diplomado (c y tecnol)
8. Evaluación Heurística (HCI 1)
Publicidad

Similar a Tema 6: Definiciones por recursión en Haskell (20)

PDF
Portafolio
DOCX
Portafolio
DOCX
Funcion recursiva
PDF
Programación Orientada a Objetos parte 3
PPT
Segundo Bimestre
PPT
Unidad 2 p1
PPTX
2 clase 1_recursividad
PPT
Programacion logica
PPTX
DIAPOSITIVAS DE LA UNIDAD 3
PDF
Recursión
PPTX
Unidad 2 & 3 estructura datos
PPTX
Estructura datos unidad-2_y_3
PPTX
Estructura datos unidad-2_y_3
PPT
METODOLOGIA Y TECNOLOGIA DE LA PROGRAMACION I
PPT
3 recursividad
PDF
Recursividad
PPTX
Recursividad
PDF
Metodologia de la programacion recursividad
PPT
Video Segundo Bimestre Metodologia Abierta
Portafolio
Portafolio
Funcion recursiva
Programación Orientada a Objetos parte 3
Segundo Bimestre
Unidad 2 p1
2 clase 1_recursividad
Programacion logica
DIAPOSITIVAS DE LA UNIDAD 3
Recursión
Unidad 2 & 3 estructura datos
Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3
METODOLOGIA Y TECNOLOGIA DE LA PROGRAMACION I
3 recursividad
Recursividad
Recursividad
Metodologia de la programacion recursividad
Video Segundo Bimestre Metodologia Abierta

Más de José A. Alonso (20)

PDF
Tema 12: Analizadores sintácticos funcionales.
PDF
Tema 23: Técnicas de diseño descendente de algoritmos
PDF
I1M-T19: El TAD de los árboles de búsqueda
PDF
I1M-T17: El TAD de los conjuntos
PDF
Panorama de la demostración asistida por ordenador
PDF
LMF-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LMF-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LMF-T5b: Aplicaciones de la lógica proposicional
PDF
LMF-T5: Resolución proposicional
PDF
LMF-T4: Formas normales
PDF
LMF-T3: Tableros semánticos
PDF
LMF-T2: Deducción natural proposicional
PDF
I1M-T21: El TAD de los polinomios en Haskell
PDF
LMF-T1: Sintaxis y semántica de la lógica proposicional
PDF
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
PDF
LI-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LI-T5b: Algoritmos para SAT. Aplicaciones
PDF
Panorama del razonamiento automático
PDF
I1M2010-T24: Programación dinámica en Haskell
PDF
LI2011-T11: Resolución en lógica de primer orden
Tema 12: Analizadores sintácticos funcionales.
Tema 23: Técnicas de diseño descendente de algoritmos
I1M-T19: El TAD de los árboles de búsqueda
I1M-T17: El TAD de los conjuntos
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 orden
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5: Resolución proposicional
LMF-T4: Formas normales
LMF-T3: Tableros semánticos
LMF-T2: Deducción natural proposicional
I1M-T21: El TAD de los polinomios en Haskell
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-T6: Sintaxis y semántica de la lógica de primer orden
LI-T5b: Algoritmos para SAT. Aplicaciones
Panorama del razonamiento automático
I1M2010-T24: Programación dinámica en Haskell
LI2011-T11: Resolución en lógica de primer orden

Último (20)

PDF
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
PDF
Teologia-Sistematica-Por-Lewis-Sperry-Chafer_060044.pdf
DOCX
PLAN DE CASTELLANO 2021 actualizado a la normativa
PDF
Fundamentos_Educacion_a_Distancia_ABC.pdf
PDF
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
PDF
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
PPTX
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx
PDF
2.0 Introduccion a processing, y como obtenerlo
DOCX
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
PDF
ciencias-1.pdf libro cuarto basico niños
PDF
Híper Mega Repaso Histológico Bloque 3.pdf
DOCX
PLANES DE área ciencias naturales y aplicadas
PDF
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
PDF
MATERIAL DIDÁCTICO 2023 SELECCIÓN 1_REFORZAMIENTO 1° BIMESTRE.pdf
PDF
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
PDF
CIRSOC-201-2024_Proyecto de Reglamento Argentino de Estructuras de Hormigón
PDF
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
PDF
Habitos de Ricos - Juan Diego Gomez Ccesa007.pdf
PDF
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
PDF
1. Intrdoduccion y criterios de seleccion de Farm 2024.pdf
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
Teologia-Sistematica-Por-Lewis-Sperry-Chafer_060044.pdf
PLAN DE CASTELLANO 2021 actualizado a la normativa
Fundamentos_Educacion_a_Distancia_ABC.pdf
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx
2.0 Introduccion a processing, y como obtenerlo
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
ciencias-1.pdf libro cuarto basico niños
Híper Mega Repaso Histológico Bloque 3.pdf
PLANES DE área ciencias naturales y aplicadas
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
MATERIAL DIDÁCTICO 2023 SELECCIÓN 1_REFORZAMIENTO 1° BIMESTRE.pdf
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
CIRSOC-201-2024_Proyecto de Reglamento Argentino de Estructuras de Hormigón
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
Habitos de Ricos - Juan Diego Gomez Ccesa007.pdf
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
1. Intrdoduccion y criterios de seleccion de Farm 2024.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