;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRACTICA-6.TXT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Recursi\'on e iteraci\'on. Para facilitar el trabajo divide la pantalla en dos ventanas mediante CTRL-X 2 y, en una de ellas, crea un buffer para trabajar con el int\'erprete, mediante ESC-X run-scheme ENTER. Utiliza CTRL-X O para saltar de una a otra ventana, mientras haces los ejercicios. |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| | NOTA: Recuerda que no es necesario teclear en el int\'erprete | | expresiones que ya aparezcan en este fichero. Para ello primero debes | | pasar a modo scheme, tecleando (con el cursor en este buffer) | | ESC-X scheme-mode ENTER. Luego, cada vez que quieras evaluar una expresi\'on | | que ya est\'a escrita en este fichero, no tendr\'as que teclearla de nuevo | | en el buffer del int\'erprete. Bastar\'a que coloques el cursor al | | principio de la expresi\'on y teclees CTRL-C CTRL-E. | | Observar\'as que en la ventana de scheme aparece el valor de la | | expresi\'on. | |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| | NOTA: Recuerda tambi\'en que no es necesario escribir las expresiones | | pedidas en el int\'erprete. Puedes escribirlas en este buffer debajo | | de cada apartado y evaluar lo que escribes con CTRL-C CTRL-E, viendo la | | respuesta en el buffer de Scheme. As\'i, podr\'as corregir fallos | | f\'acilmente y adem\'as al final de la clase, si grabas este fichero, | | tendr\'as los ejercicios resueltos, sin necesidad de anotar en papel | | las soluciones. Al usar CTRL-C CTRL-E recuerda que la expresi\'on que | | deseas evaluar debe comenzar con par\'entesis y el primero de ellos debe | | ocupar la PRIMERA COLUMNA DE LA IZQUIERDA. | |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| *************************************************************************** * EJERCICIO 1 * *************************************************************************** Definir un procedimiento suma-primeros-it que sea una versi\'on iterativa del procedimiento suma-primeros definido en la practica 3. Utilicese para ello un procedimiento auxiliar suma-primeros-it-aux. Eval\'ua (trace suma-primeros-it-aux) y calcula algunos valores, intentando comprender lo que aparece en pantalla. Comp\'aralo con la versi\'on anterior del procedimiento suma-primeros. No olvides evaluar (untrace suma-primeros-it-aux) para deshacer la traza. *************************************************************************** * EJERCICIO 2 * *************************************************************************** Definir un procedimiento ITERATIVO suma-cubos que tome como argumentos dos n\'umero enteros a y b y que devuelva la suma de los cubos de los n\'umeros enteros que est\'an entre a y b, ambos inclusive. Ejemplos: (suma-cubos 3 6) ==> 432 (suma-cubos -3 3) ==> 0 (suma-cubos 3 1) ==> 0 (suma-cubos 1 500) ==> 15687562500 *********************************************************************** * EJERCICIO 3 * *********************************************************************** Definir un procedimiento ITERATIVO cuadrados-it que reciba como entrada una lista L y devuelva la lista formada por los cuadrados de los elementos de L que sean n\'umeros, situados en el mismo orden en que los correspondientes n\'umeros aparecen en L. Ejemplos: (cuadrados-it '(a b c d)) ==> () (cuadrados-it '(2 a 3 b 4 c 5 d)) ==> (4 9 16 25) (cuadrados-it '(1 2 hola)) ==> (1 4) *********************************************************************** * EJERCICIO 4 * *********************************************************************** El siguiente procedimiento, llamado misterio1, recibe dos argumentos, el primero de ellos una lista y el segundo un n\'umero y est\'a definido de la siguiente manera: (define misterio1 (lambda (l acc) (cond ((null? l) acc) ((and (number? (car l)) (even? (car l))) (misterio1 (cdr l) (+ (car l) acc))) ((pair? (car l)) (misterio1 (cdr l) (+ acc (misterio1 (car l) 0)))) (else (misterio1 (cdr l) acc))))) Describir el comportamiento general de misterio1. Es misterio1 un procedimiento iterativo? Eh? *********************************************************************** * EJERCICIO 5 * *********************************************************************** Define un un procedimiento ITERATIVO suma-par-prof-it que reciba como entrada una lista (y un acumulador, inicialmente a 0) y devuelva la suma de los n\'umeros pares de la lista, sea cual sea su profundidad. Por ejemplo: (suma-par-prof-it '(a (2 1 (4 juan (6 7))) (((8)))) 0) ==> 20 (suma-par-prof-it '(((((a)))) 4) 0) ==> 4 (suma-par-prof-it '(1 2 3 4 5 6) 0) ==> 12 *********************************************************************** * EJERCICIO 6 * *********************************************************************** Define un procedimiento borra-profundo que tome una lista y un elemento como entrada y devuelva la lista obtenida borrando dicho elemento de la lista en todos los niveles. Por ejemplo: (borra-profundo 'juan '(pedro (antonio juan) juan ((juan juan jose) juan))) ==> (pedro (antonio) ((jose))) (borra-profundo '(juan pepe) '(((juan pepe) juan pepe))) ==> ((juan pepe)) *********************************************************************** * EJERCICIO 7 * *********************************************************************** Define un procedimiento iterativo suma-leibnitz que dado n calcule la suma de los n primeros t\'erminos de la sucesi\'on 1, -1/3, 1/5, -1/7, 1/9, -1/11 Por ejemplo: (suma-leibnitz 5 0) ==> 0.834920634920635 (suma-leibnitz 10 0) ==> 0.760459904732351 Usarlo para calcular aproximaciones de pi. Nota: pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 ... Por ejemplo: (* 4 (suma-leibnitz 20000 0)) ==> 3.14154265358982 *********************************************************************** * EJERCICIO 8 * *********************************************************************** Definir un procedimiento ITERATIVO simbolos-it que tome una lista y devuelva una lista formada por todos los s\'imbolos que aparecen en la lista (en el nivel superior). Por ejemplo: (simbolos-it '(1 (rojo verde) azul 3 amarillo ) ()) ==> (azul amarillo) A continuaci\'on definir otro procedimiento ITERATIVO simbolos-prof-it que haga lo mismo pero en todos los niveles (versi\'on profunda del anterior). Por ejemplo: (simbolos-prof-it '(1 (rojo verde) azul 3 amarillo ) ()) ==> (rojo verde azul amarillo) (simbolos-prof-it '(1 (rojo (verde ())) azul 3 amarillo ) ()) ==> (rojo verde azul amarillo)