LISP I. Programación recursiva frente a iterativa. Características de la programación recursiva:



Documentos relacionados
El lenguaje LISP. LISP is an easy language to learn

El lenguaje LISP. LISP is an easy language to learn (Henry et.al., 1984) Introducción

Resumen de LISP. Javier Gil Julio, 2011

Tema 1: Introducción a Lisp

Metodologías de Programación II Listas en Lisp

Manual de Lisp para IACS (Curso 91 92)

3 LISTAS EN LISP. Figura 1: Una lista de un elemento, como cons a nil. nil. 1 CL-USER> (cons a nil) 2 (A) 3 CL-USER> (car (a)) 4 A

Curso de programación en Lisp

Curso de Lisp con Golden Common Lisp

Anexo 3: Implementaciones en Lisp

Implementación de algoritmos y cálculo simbólico

PRACTICA 1. PROGRAMACIÓN EN LISP Fecha de publicación: 29 de septiembre de Duración: 3 sesiones de laboratorio. Versión: 2011/09/29

PROGRAMACIÓN DECLARATIVA

Tema 3. Listas Recursión sobre datos

Dpto. de. Álgebra, Computación, Geometría y Topología Universidad de Sevilla. Manual de Lisp. José A. Alonso Jiménez

Tema 3: Técnicas básicas de

Práctica 2 de IA /2012. LÓGICA Fecha publicación: 26 de octubre de 2011 Duración: 3 sesiones de laboratorio Versión: 2011/10/26

Introducción al Lenguaje Common Lisp

LECCIÓN 8. BÚSQUEDAS CON ÁRBOL

GUÍA BÁSICA DE SCHEME v.4

TP 3: intérprete de C en LISP (alias máquina virtual de C en LISP )

Programación Funcional en LISP Lógica para Ciencias de la Computación

Tema 5.- Tipos de datos compuestos

Lenguajes de Programación Programación funcional

Tema 6: Técnicas heurísticas en juegos

Programación Funcional Lisp-Scheme

Inteligencia Artificial I 3ra. Práctica: Algoritmos de Búsqueda

Tema 6: Búsqueda local y algoritmos genéticos

LECCION 3. FUNCIONES (I).

Tema 3: Características de la programación funcional. Sesión 6: El paradigma funcional (2)

Tema 4: Programación funcional avanzada en Scheme

PRIMER TUTORIAL DE LipsWorks Personal Edition 6.0.1

4.3 Recursión en Scheme. Recursión simple y asignación

4.3 Recursión en Scheme

Tema 3: Características de la programación funcional

FUNCIONES BÁSICAS TIMES ADD1 SUB1

Procedimientos y Recursividad

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca

Tablas Hash y árboles binarios

Tema 2: Introducción a Scheme. Sesión 4: Introducción a Scheme (2)

Programación Declarativa

LISP. El manejo de símbolos. Ejemplos de expresiones simbólicas. Motivación

CLIPS Definición de funciones


p(b, n) =b n, (b Z, n N) Esta definición matemática, recursiva, proporciona el procedimiento computacional

Tema 4: Procedimientos y estructuras recursivas

Tema 4: Recursión e inducción en ACL2

Funciones & Estructuras de control

Complejidad de Algoritmos

4.7 Operaciones sobre Objetos en Scheme

Introducción a OCaml. October 19, 2015

4.7 Operaciones sobre Objetos en Scheme. Equivalencias y predicados de tipos, listas, números, caracteres, strings y vectores

2 INTRODUCCIÓN A LISP

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

Niveles de abstracción. Lisp y la pedagogía

PROGRAMACIÓN ORIENTADA A LA INTELIGENCIA ARTIFICIAL

PROGRAMACIÓN AUTOLISP

Indice DISEÑO ASISTIDO POR ORDENADOR TEMA: SELECCIÓN DE OBJETOS

4.5 Ligado de Variables en Scheme

Abstracción de procedimientos

Tema 6: Estructuras de datos recursivas

Tema 4.- Recursión e iteración

Tema 3: Recursión. Índice

MANUAL BÁSICO DEL LENGUAJE SQL

Tema 10: Tipos de datos mutables

Proposiciones Condicionales

Inducción, Recursión y Alcance. Inducción, Recursión y alcance. Inducción, Recursión y Alcance. Inducción, Recursión y Alcance

Introducción a la programación funcional

Lección 8: Potencias con exponentes enteros

Lenguajes de programación. Abdiel E. Cáceres González Instituto Tecnológico de Monterrey Campus Ciudad de México Verano 2004

PROGRAMACIÓN ORIENTADA A LA INTELIGENCIA ARTIFICIAL

Metodologías de Programación II Macros en Lisp

7 MULTI-PROCESAMIENTO EN LISP

LECCION 1. ATOMOS Y LISTAS.

Tema 3: Programación funcional

TEMA 1 FUNDAMENTOS DE PROGRAMACIÓN

Estructura de Datos y de la Información

Access SQL: DDL y DML. Una empresa de Ingeniería precisa una base de datos para la gestión de sus proyectos.

Abstracción Sintáctica y Abstracción de Datos

Rolando Burgos Cárdenas MANUAL DE REFERENCIA RAPIDA DE LISP.

Macros en Lisp Cómo funcionan las macros?

Capítulo 3 Algoritmos recursivos

APÉNDICE: EJERCICIOS DE PROGRAMACIÓN JESÚS GONZÁLEZ BOTICARIO

Composición Asistida por Computadora

Metodologías de Programación II Introducción

UNIDAD I. ALGORITMOS

Estructuras de control. Secuencial, condicional y repetitivas.

Introducción a las sentencias de control

Concepto, Paradigma, Lenguaje y Modelo de Programación

PL/SQL. DECLARE /* Parte Declarativa */ BEGIN /* Parte de Ejecución */ EXCEPTION /* Parte de Excepciones */ END;

Características del lenguaje SQL

Algoritmos y Diagramas de flujo

Examen Lenguajes de Programación (CC41A)

Estructuras de control condicionales

Abstracción de Datos y

Transcripción:

LISP I 1 Programación recursiva frente a iterativa Características de la programación recursiva:» Implementación intuitiva y elegante. La traducción de la solución recursiva de un problema (caso base y caso recursivo a código Lisp es prácticamente inmediata.» Útil para optimizar cálculos. Las estructuras de datos en Lisp hacen un uso implíctito de los punteros, como en las listas: NIL ó Un cons cuyo cdr es, a su vez, una lista» Útil cuando hay varios niveles de anidamiento. La solución para un nivel es válida para el resto. Formas de hacer versión iterativa:» Con mapcar» Con bucles (dolist, dotimes, etc. Desaconsejado. 2

Ejemplos de recursividad, (1 Ejemplo del cálculo de la potencia de un número optimizada > (defun potencia (x n ;; Optimizacion calculo potencia" (cond ((= n 0 1 ((evenp n (expt (potencia x (/ n 2 2 (t (* x (potencia x (- n 1 > (potencia 2 8 La interpretación y comprensión del código es compleja. Por ello es importante llegar a un compromiso entre la claridad de la programación y la eficiencia en la misma. Ejemplos de recursividad, (2 Contar los átomos de cualquier expresión LISP: > (cuenta-atomos '(a (b c ((d e f 6 > (defun cuenta-atomos (expr (cond ((null expr 0 ((atom expr 1 (t (+ (cuenta-atomos (first expr (cuenta-atomos (rest expr 4

Ejemplos de recursividad, ( Aplanar una lista:» (aplana (a (b c ((d e f >>> (A B C D E F > (defun aplana (lista (cond ((null lista NIL ((atom (first lista (cons (first lista (aplana (rest lista (t (append (aplana (first lista (aplana (rest lista 5 Ejemplos de recursividad, (4 Número de sublistas de una lista (número de veces que se abre paréntesis, menos 1:» (sublistas (a (b c ((d e f >>> > (defun sublistas (expresion (cond ((or (null expresion (atom expresion 0 (t (+ (if (atom (first expresion 0 1 (sublistas (first expresion (sublistas (rest expresion 6

Ejemplos de recursividad, (5 Producto escalar:» (producto '(2 '(4 5 >>> 2» 2 x 4 + x 5 = 2 Versiones válidas:» Versión recursiva: > (defun producto (vector1 vector2 (if (or (null vector1 (null vector2 0 (+ (* (first vector1 (first vector2 (producto (rest vector1 (rest vector2» Versión con mapcar >(defun producto (vector1 vector2 (apply #'+ (mapcar #'* vector1 vector2 7 Ejemplos de recursividad, (6 Versión no válida del producto escalar:» Versión iterativa (no recomendable: > (defun producto (vector1 vector2 (let ((suma 0 (dotimes (i (length vector1 (setf suma (+ suma (* (nth i vector1 (nth i vector2 suma 8

Ejemplos de recursividad, (7 > (defun profundidad-maxima (expresion (cond ((null expresion 0 ((atom expresion 1 (t (+ 1 (apply #'max (mapcar #'profundidad-maxima expresion >>> PROFUNDIDAD-MAXIMA > (profundidad-maxima '(1 >>>> 2 > (profundidad-maxima '((1 (2 ( 4 >>>> 5 9 Repaso de operadores, (1 Recordemos los siguientes operadores:» COUNT-IF, FIND-IF, REMOVE-IF, REMOVE-IF-NOT, DELETE-IF, DELETE-IF-NOT» COUNT / COUNT-IF Contar apariciones: (count <elemento> <lista> [:test <fun-igualdad>]» (count 2 (1 2 4 2 4 5 2 Contar los elementos que cumplen /no cumplen una condición de una lista (count-if[-not] <predicado><lista>» (count-if oddp (1 2 4 5 6 10

Repaso de operadores, (2» FIND / FIND-IF Devuelve la primera aparición: (find <elemento> <lista> [:test <fun-igualdad>]» (find 2 (1 2 4 2 4 5 2 2 Devuelve el primer elemento que cumple/o no cumple el predicado (find-if[-not] <predicado><lista>» (find-if oddp '(1 2 4 2 4 5 2 1» REMOVE / REMOVE-IF Borrar las apariciones de un elemento indicado (remove <elemento> <lista> [:test <fun-igualdad>]» (remove 2 (1 2 4 2 4 5 2 (1 4 4 5 Elimina los que cumple/o no cumple el predicado (remove-if[-not] <predicado><lista>» (remove-if oddp '(1 2 4 2 4 5 2 (2 4 2 4 2 11 Ejemplos de recursividad, (8 Objetivo: sin utilizar remove-if, conseguir la misma funcionalidad del operador:» (quitar-si evenp '(1 2 4 (1 Versiones válidas:» Versión recursiva: (defun quitar-si (predicado lista (cond ((null lista nil ((funcall predicado (car lista (quitar-si predicado (cdr lista (t (cons (car lista (quitar-si predicado (cdr lista» Versión con mapcar (defun quitar-si (predicado lista (delete NIL (mapcar #'(lambda (elemento (when (not (funcall predicado elemento elemento lista 12

Ejemplos de recursividad, (9 Recorriendo la lista con dolist: (defun QUITAR-SI (predicado lista (let (listaaux (dolist (i lista listaaux (if (not (eval (list predicado i (setf listaaux (append listaaux (list i 1 Ejemplos de recursividad, (10 Versión errónea:» Mal uso de mapcar. El hecho de que hagamos uso de mapcar no garantiza la corrección del código programado. (defun QUITAR-SI2 (predicado lista (mapcar # (lambda (elemento (if (apply predicado (list elemento (remove elemento lista lista > (QUITAR-SI2 'evenp '(1 2 4 (NIL (1 4 NIL (1 2 14