Práctica 3: Parejas, datos compuestos y listas Ejercicio 1 a) Empezamos definiendo unas funciones auxiliares que es posible que necesitemos. Construye las funciones: (suma-izquierda num pareja) : devuelve una nueva pareja en la que se suma num a la parte izquierda de pareja (suma-derecha num pareja) : devuelve una nueva pareja en la que se suma num a la parte derecha de pareja (suma-parejas p1 p2) : devuelve una nueva pareja con la suma de las partes izquierdas y las partes derechas Ejemplo: (suma-izquierda 4 '(12 . 20)) (16 . 20) (suma-derecha 4 '(12 . 20)) (12 . 24) (suma-parejas '(12 . 20) '(-1 . -8)) (11 . 12) b) Define una función recursiva (suma-pares-impares lista-num) que devuelva una pareja cuya parte izquierda sea la suma de todos los números pares de la lista y la parte derecha la suma de todos sus números impares. En el caso en que ningún número par o impar deberá devolver 0. Ejemplos: (suma-pares-impares '(1 2 3 4 5 6)) (12 . 9) (suma-pares-impares '(1 3 5 7)) (0 . 16) Ejercicio 2 a) Dibuja el diagrama box & pointer de la siguiente expresión y explica si genera una lista: (cons (cons (cons 1 2) (cons 3 4)) (cons (list 5 6 (cons 7 (cons 8 9))) (cons 10 11))) b) Dado el siguiente box & pointer, escribe una expresión en Scheme que lo genere usando sólo llamadas a cons y explica si la expresión resultante es una lista: Ejercicio 3 Escribe una función (tres-en-raya? x tablero) que reciba un símbolo y una lista de tres listas de tres elementos que representa un tablero de tres filas y tres columnas. Cada lista representa cada una de las filas del tablero. Por ejemplo, la lista '((x - o)(- x o) (o - x)) representa el tablero x - o - x o o - x La función deberá comprobar si se ha conseguido tres en raya con el símbolo y el tablero que se pasa como parámetro. Puedes usar tanto funciones c????r como la función list-ref . Intenta usar la función más conveniente en cada caso, usando c????r cuando la posición a la que se quiere acceder es fija y list-ref cuando es variable. Ejemplos: (tres-en-raya? 'o '((x (x (#t (tres-en-raya? 'o '((x (x (o #t (tres-en-raya? 'o '((x (x (o #t (tres-en-raya? 'o '((x (x (o #f - o) - o) x o))) x o) - x) o o))) - o) o x) x o))) - x) o x) x o))) Ejercicio 4 Escribe la función recursiva (mayor-que n lista-nums) que recibe un número n y un lista de números y devuelve una lista con los booleanos resultantes de comparar cada número de la lista con n . Ejemplo: (mayor-que 10 '(1 23 4 -1 12 11 10)) (#f #t #f #f #t #t #f) Ejercicio 5 Define la función recursiva (intercala-si-suma>n lista1 lista2 n) que reciba dos listas y un número n . Deberá devolver una nueva lista donde se hayan intercalado los elementos de ambas sólo si la suma de los elementos en la misma posición es mayor o igual que `n. (define l1 '(1 2 3 4 3 4 5 6 7)) (define l2 '(5 1 2 1 2 1 0 2 0)) (intercala-si-suma>n l1 l2 6) (1 5 6 2 7 0) Ejercicio 6 Escribe la función (expande pareja1 pareja2 ...) que reciba un número variable de parejas como argumento donde cada pareja contiene un dato y un número y devuelva una lista donde se hayan “expandido” las parejas, añadiendo tantos elementos como el número que indique cada pareja. Todos los argumentos son opcionales. Ejemplo: (expande (cons 'a 4) (cons "hola" 2) (cons #f 3)) (a a a a "hola" "hola" #f #f #f) (expande) () Ejercicio 7 Define una función recursiva llamada ocurrencias-elementos que tome como argumentos dos listas y devuelva una lista de parejas, en donde cada pareja contiene en su parte izquierda un elemento de la segunda lista y en su parte derecha el número de veces que aparece dicho elemento en la primera lista. Puedes definir las funciones auxiliares que necesites. Ejemplo : (ocurrencias-elementos '(1 3 6 2 4 7 3 9 7) '(5 2 3)) ((5 . 0) (2 . 1) (3 . 2)) Lenguajes y Paradigmas de Programación, curso 2013–14 © Departamento Ciencia de la Computación e Inteligencia Artificial, Universidad de Alicante Cristina Pomares, Domingo Gallardo