;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRACTICA-5.TXT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Recursi\'on plana y profunda. 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 * *************************************************************************** El siguiente procedimiento, llamado misterio1, recibe tres argumentos, el \'ultimo de ellos una lista, y est\'a definido de la siguiente manera: (define misterio1 (lambda (a b l) (cond ((or (null? l) (null? (cdr l))) l) ((and (equal? b (car l)) (equal? b (cadr l))) (append (list b a) (misterio1 a b (cdr l)))) (else (cons (car l) (misterio1 a b (cdr l))))))) Describir el comportamiento general de misterio1. *************************************************************************** * EJERCICIO 2 * *************************************************************************** Define un procedimiento acumula-profundo que recibe como entrada una lista y devuelve la suma de sus elementos que sean n\'umeros, sea cual sea su nivel. Por ejemplo: (acumula-profundo '(1 (4 (a #t () (3 b)) 5 juan) (((a))) ((3)))) ==> 16 (acumula-profundo '(a (b c ()) d)) ==> 0 (acumula-profundo '()) ==> 0 (acumula-profundo '(1 (uno (2 (dos (3 (tres (4 (cuatro))))))))) ==> 10 *************************************************************************** * EJERCICIO 3 * *************************************************************************** Define un procedimiento llamado quita-ultimo-profundo que recibe una lista como argumento y devuelve la lista obtenida quitando el \'ultimo elemento, cualquiera que sea su nivel. Por ejemplo: (quita-ultimo-profundo '(a (b c) (d (e (f))))) ==> (a (b c) (d (e ()))) (quita-ultimo-profundo '()) ==> () (quita-ultimo-profundo '(a (((b))) (()))) ==> '(a (((b))) ()) (quita-ultimo-profundo '((((b))))) ==> (((()))) *************************************************************************** * EJERCICIO 4 * *************************************************************************** El siguiente procedimiento, llamado misterio2, recibe tres argumentos, los dos primeros \'atomos y el \'ultimo de ellos una lista, y est\'a definido de la siguiente manera: (define misterio2 (lambda (a b l) (cond ((null? l) l) ((pair? (car l)) (cons (misterio2 a b (car l)) (misterio2 a b (cdr l)))) ((null? (cdr l)) l) ((and (equal? b (car l)) (equal? b (cadr l))) (append (list b a) (misterio2 a b (cdr l)))) (else (cons (car l) (misterio2 a b (cdr l))))))) Describe el comportamiento general de misterio2. *********************************************************************** * EJERCICIO 5 * *********************************************************************** Define un procedimiento cuenta-parentesis que reciba como argumento una lista y devuelva su n\'umero total de par\'entesis (tanto abiertos como cerrados). Por ejemplo: (cuenta-parentesis '() ) ==> 2 (cuenta-parentesis '((a b) c) ) ==> 4 (cuenta-parentesis '(((a () b) c) () ((d) e)) ) ==> 14 *********************************************************************** * EJERCICIO 6 * *********************************************************************** Escribe un procedimiento primero-profundo que reciba una lista como argumento y devuelva el primer elemento, cualquiera que sea su nivel (si la lista es vac\'ia, devolver la lista vac\'ia). Por ejemplo: (primero-profundo '((((a b) c) d e (1)) s)) ==> a (primero-profundo '((((b))))) ==> b (primero-profundo ()) ==> () *************************************************************************** * EJERCICIO 7 * *************************************************************************** Define un procedimiento raiz-seno que recibiendo como entrada dos n\'umeros reales (el primero menor estricto que el segundo) cuya distancia es menor que pi devuelve la raiz que est\'a entre ambos (con un error menor de una mil\'esima) de la funci\'on sen(x). Devuelve error si entre esos n\'umeros no hay tal raiz. (Indicaci\'on: Usar el m\'etodo de b\'usqueda dicot\'omica). Ejemplos: (raiz-seno 3 4) ==> 3.14111328125 (raiz-seno 9 10) ==> 9.42431640625 (raiz-seno 7 9) ==> ERROR: raiz-seno: no hay raiz entre estos numeros