Download Procedimientos y estructuras recursivas

Document related concepts
no text concepts found
Transcript
Tema 4: Procedimientos y estructuras recursivas
Sesión 11: Procedimientos y estructuras recursivas (3)
martes 15 de marzo de 2011
Hoy veremos...
• Diseño de procedimiento recursivos
• Recursión mutua
• Coste espacial de la recursión
• Tail Recursion (recursión por la cola)
• Expresiones S
• Árboles binarios y genéricos
martes 15 de marzo de 2011
Referencias
• Capítulo 1.2.1, 1.2.2 Abelson & Sussman: Linear Recursion and Iteration, Tree
Recursion
martes 15 de marzo de 2011
Repaso: ¿cómo modificar una lista en
programación funcional?
• En programación funcional no es posible modificar una lista. Siempre hay que
construir una nueva. Se puede añadir elementos a una lista ya existente.
(define (cuadrado lista)
(if (null? lista)
'()
(cons (cuadrado (car lista))
(cuadrado (cdr lista)))))
martes 15 de marzo de 2011
Repaso: ¿cómo modificar una lista en
programación funcional?
• En programación funcional no es posible modificar una lista. Siempre hay que
construir una nueva. Se puede añadir elementos a una lista ya existente.
(define (cuadrado lista)
(if (null? lista)
'()
(cons (cuadrado (car lista))
(cuadrado (cdr lista)))))
(define (mi-map proc lista)
(if (null? lista)
'()
(cons (proc (car lista))
(mi-map proc (cdr lista)))))
martes 15 de marzo de 2011
Listas de asociación
• Una lista de asociación es una lista cuyos elementos son parejas de la forma
(clave, valor)
• Scheme define la función assq que busca una pareja por su clave
• Ejemplos:
(define l-assoc (list (cons 'a 1) (cons 'b 2) (cons 'c 3)))
(assq 'a l-assoc)
(assq 'b l-assoc)
(assq 'c l-assoc)
(assq 'd l-assoc)
(cdr (assq 'c l-assoc))
martes 15 de marzo de 2011
Implementación de funciones sobre listas de
asociación
• Implementación de my-assq:
• Implementación de add-pair:
• ¿Cómo haríamos delete-pair? ¿Y modify-pair?
martes 15 de marzo de 2011
Implementación de funciones sobre listas de
asociación
• Implementación de my-assq:
(define (my-assq x lista)
(cond
((null? lista) #f)
((equal? (caar lista) x) (car lista))
(else (my-assq x (cdr lista)))))
• Implementación de add-pair:
• ¿Cómo haríamos delete-pair? ¿Y modify-pair?
martes 15 de marzo de 2011
Implementación de funciones sobre listas de
asociación
• Implementación de my-assq:
(define (my-assq x lista)
(cond
((null? lista) #f)
((equal? (caar lista) x) (car lista))
(else (my-assq x (cdr lista)))))
• Implementación de add-pair:
(define (add-pair key value lista)
(if (not (my-assq key lista))
(cons (cons key value)
lista)
(error "ya existe la clave")))
• ¿Cómo haríamos delete-pair? ¿Y modify-pair?
martes 15 de marzo de 2011
Expresiones-S originales
• Introducidas originalmente por John McCarthy en el artículo Recursive
Functions of Symbolic Expressions and Their Computation by Machine, Part
I, en el que define el lenguaje de programación LISP.
• En su definición original matemática las expresiones-S se escriben utilizando
la notación del punto:
- Un dato atómico es una expresión-S
- Si e1 y e2 son expresiones-S, la expresión (e1 . e2) también es una expresión-S
• Con la misma notación una lista se define de la siguiente forma:
(a1 a2 ... an) = (a1 . (a2 . ( ... (an . NIL) ...)))
• El dato atómico NIL es el fin de lista
martes 15 de marzo de 2011
Expresiones-S de McCarthy
• Las siguientes expresiones son expresiones-s de McCarthy:
• Las siguientes expresiones no son expresiones-S de McCarthy:
martes 15 de marzo de 2011
Expresiones-S de McCarthy
• Las siguientes expresiones son expresiones-s de McCarthy:
(A . B)
(A . (B . C))
((A . B) . (C . D))
(A. ((A . B) . (C . D)))
• Las siguientes expresiones no son expresiones-S de McCarthy:
martes 15 de marzo de 2011
Expresiones-S de McCarthy
• Las siguientes expresiones son expresiones-s de McCarthy:
(A . B)
(A . (B . C))
((A . B) . (C . D))
(A. ((A . B) . (C . D)))
• Las siguientes expresiones no son expresiones-S de McCarthy:
(A . B . C)
(A)
(() . B)
martes 15 de marzo de 2011
Notación ampliada de las expresiones-S
• La definición de la expresión-S original se ha extendido, eliminando la
notación del punto y refiriéndose a expresiones con un número balanceado
de paréntesis:
(= 4 (+ 2 2))
(if (= x y) (* x y) (+ (/ x y) 45))
(define (factorial x) (if (= x 0) 1 (* x (factorial (- x 1)))))
• Esta es la definición que vamos a usar a partir de ahora
• En Scheme se implementan como listas
martes 15 de marzo de 2011
Expresiones-S en Scheme
• Cualquier expresión de Scheme es una expresión-s
• No todas las expresiones-s son expresiones de Scheme
(define (factorial x) (if (= x 0) 1 (* x (factorial (- x 1)))))
(1 (2 (3)))
martes 15 de marzo de 2011
Las expresiones-S definen estructuras jerárquicas
• Las expresiones-s pueden representan una estructura de niveles
• Los datos de las listas representan las hojas:
((1 2 3) 4 5)
4 5
1 2 3
• Otro ejemplo:
(let ((x 12)
(y 5))
(+ x y)))
martes 15 de marzo de 2011
let
+
x
12 y
5
y
z
Definición recursiva y funciones de manejo
Una expresión-s es una lista cuyos elementos pueden ser hojas (datos atómicos) o
expresiones-s
martes 15 de marzo de 2011
Definición recursiva y funciones de manejo
Una expresión-s es una lista cuyos elementos pueden ser hojas (datos atómicos) o
expresiones-s
• Funciones para trabajar con expresiones-S: Una expresión-s es una lista,
utilizaremos para construirlo y recorrerlo las funciones definidas sobre listas:
• list y quote: construcción
• cons: añadir elemento a la cabeza
• car: devuelve el primer dato (puede ser una hoja u otra expresión-S)
• cdr: devuelve el resto (siempre una lista)
• null?: comprueba si es lista vacía
martes 15 de marzo de 2011
Función hoja?
• Para remarcar el carácter jerárquico de las expresiones-s definimos la función
hoja? que comprueba si el elemento es una hoja o una expresión-s (lista)
(define (hoja? x)
(not (pair? x)))
martes 15 de marzo de 2011
Funciones sobre expresiones-S
• (cuenta-hojas-exp exp): cuenta las hojas
• (niveles-exp exp): cuenta los niveles
• (pertenece-exp? x exp): busca una hoja
• (cuadrado-exp exp): eleva todas las hojas al cuadrado
• (map-exp f exp): similar a map
martes 15 de marzo de 2011
cuenta-hojas-exp
martes 15 de marzo de 2011
cuenta-hojas-exp
(define (cuenta-hojas-exp exp)
(cond
((null? lista) 0)
((hoja? (car exp)) (+ 1 (cuenta-hojas-exp (cdr exp))))
(else
(+ (cuenta-hojas-exp (car exp))
(cuenta-hojas-exp (cdr exp))))))
martes 15 de marzo de 2011
niveles-exp
martes 15 de marzo de 2011
niveles-exp
(define (niveles-exp exp)
(cond
((null? exp) 0)
((hoja? exp) 0)
(else (max (+ 1 (niveles-exp (car exp)))
(niveles-exp (cdr exp))))))
martes 15 de marzo de 2011