Download Boletín 3

Document related concepts
Transcript
Recursión sobre datos
1.- Denir un procedimiento media-arit que calcule la media aritmética de los elementos
de una lista de números
(media-arit '(2 4 6 1))
(media-arit '(34))
(media-arit ())
reales. Si la lista es vacía debe devolver 0.
=> 13/4
=> 34
=> 0
2.- Denir un procedimiento media-geom que calcule la media geométrica de una lista
de números reales positivos. Si la lista es vacía debe devolver 1. Recordemos que
√
dados los números a1 , . . . , an su media geométrica es el valor n a1 · · · an .
(media-geom '(1 3 5 7))
(media-geom '(2.5 1.3))
(media-geom ())
=> 3.2010858729436795
=> 1.8027756377319946
=> 1
3.- Denir un procedimiento min-max que reciba una lista numérica plana no vacía y
devuelva una lista formada por dos pares punteados de la forma (min . numero1 )
y (max . numero2 ), donde numero1 y numero2 son, respectivamente, el mínimo y
el máximo de los elementos de la lista.
(min-max '(1 2 3 4))
=> ((min . 1) (max . 4))
(min-max '(2 82 23 45 2)) => ((min . 2) (max . 82))
(min-max '(4 4 4))
=> ((min . 4) (max . 4))
4.- Denir un procedimiento ultimo que reciba una lista no vacía y devuelva el último
elemento de dicha lista.
(ultimo '(a b c))
(ultimo '((1 2) 3 (4 5)))
(ultimo '(a))
=> c
=> (4 5)
=> a
5.- Denir un procedimiento suc-creciente que reciba un número natural n y devuelva
la lista de los números desde 0 hasta n , en orden creciente.
(suc-creciente 3)
(suc-creciente 5)
=> (0 1 2 3)
=> (0 1 2 3 4 5)
6.- Denir un procedimiento aprox-lim-seno que reciba un número natural n , mayor
que 0, y devuelva una lista cuyos elementos son los términos de la sucesión sin(1/m)
1/m
desde 1 hasta n .
(aprox-lim-seno 1) => (0.8414709848078965)
(aprox-lim-seno 3) => (0.8414709848078965 0.958851077208406 0.9815840903884566)
7.- Denir un procedimiento aprox-e que reciba un número natural n , mayor que 0, y
devuelva una
1 hasta n .
(aprox-e 1)
(aprox-e 3)
(aprox-e 5)
lista cuyos elementos son los términos de la sucesión (1 +
1 m
)
m
desde
=> (2)
=> (2 2.25 2.37037037037037)
=> (2 2.25 2.37037037037037 2.44140625 2.4883199999999994)
1
8.- Denir un procedimiento lista-aleatoria que reciba un número natural n y devuelva
una lista de longitud n cuyos elementos son números aleatorios entre 1 y n . (Nota:
el procedimiento random , aplicado a un número natural n , devuelve un número
aleatorio entre 0 y n-1 .)
(lista-aleatoria 5)
(lista-aleatoria 5)
(lista-aleatoria 5)
=> (1 2 1 2 3)
=> (1 4 5 3 2)
=> (1 5 4 5 4)
9.- Denir un procedimiento resta-a-cada que reciba un número x y una lista numérica
plana l y devuelva la lista en la que a cada elemento de l se le ha restado x .
(resta-a-cada 2 ())
(resta-a-cada 2 '(3 1 5 6))
(resta-a-cada 1.5 '(0.5 0 -0.5))
=> ()
=> (1 −1 3 4)
=> (−1.0 −1.5 −2.0)
10.- Denir un procedimiento quita-ultimo que reciba una lista l , no vacía, y devuelva
la lista resultante de eliminar el último elemento de l .
(quita-ultimo '(1))
=> ()
(quita-ultimo '(a b c d e)) => (a b c d)
(quita-ultimo '(s s s))
=> (s s)
11.- Denir un procedimiento lista->numero que reciba una lista no vacía de dígitos y
devuelva el número formado por dichos dígitos.
(lista->numero '(0))
(lista->numero '(1 3 4 7))
(lista->numero '(0 0 1))
=> 0
=> 1347
=> 1
12.- Denir un procedimiento ciclo que permute cíclicamente los elementos de una lista.
Si la lista es vacía debe devolver ().
(ciclo '(2 5 7 d g))
(ciclo '(yo tu el))
(ciclo '())
=> (g 2 5 7 d)
=> (el yo tu)
=> ()
13.- Denir un procedimiento intercambia que reciba dos datos x e y y una lista l y devuelva la lista resultante de cambiar las ocurrencias de x en l por y , y las ocurrencias
de y en l por x .
(intercambia 'a 'b '(c d b a b (a b) f))
(intercambia 'a 'b ())
(intercambia '(1) '(2) '(1 (1) 2 (2)))
=> (c d a b a (a b) f)
=> ()
=> (1 (2) 2 (1))
14.- Denir un procedimiento bocata que reciba dos datos x e y y una lista l y devuelva
la lista resultante de insertar y a izquierda y derecha de cada ocurrencia de x en l .
(bocata 'a 'b '())
(bocata 'a 'b '(d a))
(bocata 'queso 'pan '(queso tomate queso jamon lechuga))
=> (pan queso pan tomate pan queso pan jamon lechuga)
2
=> ()
=> (d b a b)
15.- Denir un procedimiento dentro-del-intervalo? que reciba dos números x e y , el
primero menor o igual que el segundo, y una lista numérica plana l y devuelva #t
si todos los elementos de l están entre x e y y #f en caso contrario.
(dentro-del-intervalo? 1 5 ())
(dentro-del-intervalo? 1 5 '(3 2 4.5 1.8))
(dentro-del-intervalo? 0.5 6 '(-1 7 4))
=> #t
=> #t
=> #f
16.- Denir un procedimiento estan-en-el-intervalo que reciba dos números x e y , el
primero menor o igual que el segundo, y una lista numérica plana l y devuelva la
lista de los elementos de l que están entre x e y .
(estan-en-el-intervalo 1 5 '(3 2 4.5 1.8))
(estan-en-el-intervalo 0.5 6 '(-1 7 4))
(estan-en-el-intervalo 3 9 '(1 2 17))
=> (3 2 4.5 1.8)
=> (4)
=> ()
17.- Denir un procedimiento elimina-duplicados que reciba una lista l y devuelva la
lista obtenida al eliminar en l los elementos repetidos, salvo la última ocurrencia.
(elimina-duplicados '((1) 1 1 (1)))
(elimina-duplicados '(3 1 2 3 2 1 4))
(elimina-duplicados '(1 3 5 6 d 4 a f))
=> (1 (1))
=> (3 2 1 4)
=> (1 3 5 6 d 4 a f)
18.- Denir un procedimiento union que reciba dos listas l1 y l2 , sin elementos repetidos,
y devuelva una lista formada por los elementos de l1 y de l2 , sin repeticiones.
(union () ())
(union '(q s (3) 1 2) '(f q 4 3 2))
(union '(1 (2)) '((2) 1))
=> ()
=> (q s (3) 1 2 f 4 3)
=> (1 (2))
19.- Denir un procedimiento interseccion que reciba dos listas l1 y l2 , sin elementos
repetidos, y devuelva una lista formada por los elementos comunes a ambas listas.
(interseccion '(1 2 3 4) ())
(interseccion '(1 2 3 4) '(d f t))
(interseccion '(q (4) e (r) 6) '(e 4 r (r) 2 1))
=> ()
=> ()
=> (e (r))
20.- Denir un procedimiento reagrupa que reciba una lista no vacía l cuyos elementos
sean listas de longitud 3 y actúe del siguiente modo:
(reagrupa '((#t #f #t)))
(reagrupa '((1 2 3) (4 5 6) (7 8 9)))
(reagrupa '(((a) (b) (c)) ((1) (2) (3))))
=> ((#t) (#f) (#t))
=> ((1 4 7) (2 5 8) (3 6 9))
=> (((a) (1)) ((b) (2)) ((c) (3)))
21.- Denir un procedimiento suma-listas que, dadas dos listas numéricas planas de la
misma longitud, las sume elemento a elemento.
(suma-listas '() '())
(suma-listas '(2 4) '(2 8))
(suma-listas '(1 4 6) '(3 7 2))
=> ()
=> (4 12)
=> (4 11 8)
3
22.- Denir un procedimiento intercala que reciba dos listas de la misma longitud y
devuelva la lista resultante de intercalar los elementos de cada una de las listas.
(intercala () ())
=> ()
(intercala '(1 2 3) '(a b c))
=> (1 a 2 b 3 c)
(intercala '(#t #t) '(#f #f)) => (#t #f #t #f)
23.- Denir un procedimiento ocurre-prof que reciba un dato x y una lista l y devuelva
el número de veces que ocurre x en l , en cualquier nivel.
(ocurre-prof 1 ())
(ocurre-prof 1 '(1 (y ((1) g))))
(ocurre-prof 1 '(s 7 (9) h))
=> 0
=> 2
=> 0
24.- Denir un procedimiento mult-prof que reciba una lista l y devuelva el producto
de los números que hay en l , en cualquier nivel. Si no hay ningún número, debe
devolver 1.
(mult-prof ())
=> 1
(mult-prof '(1 2 a (3 r)))
=> 6
(mult-prof '(q (1 (3 (a 9) 7)) j)) => 189
25.- Denir un procedimiento extrae-1e-2n que reciba una lista l y devuelva el primer
elemento de segundo nivel de dicha lista.
(extrae-1e-2n '(1 ((2)) (3)))
(extrae-1e-2n '(b (a c) (d e)))
(extrae-1e-2n '(a 3 d ()))
=> (2)
=> a
=> extrae-2e: no hay elementos de segundo nivel
26.- Decimos que un dato es un átomo si no es una lista no vacía. Denir un procedi-
miento cuenta-atomos que reciba una lista l y devuelva el número de átomos que
hay en l , en cualquier nivel.
(cuenta-atomos '(()))
(cuenta-atomos '(a d (e f) g))
(cuenta-atomos '(8 (a b) (() (xy z))))
=> 1
=> 5
=> 6
27.- Denir un procedimiento cuenta-no-listas que reciba una lista l y devuelva el número
de elementos de l que no son listas, en cualquier nivel.
(cuenta-no-listas '(()))
(cuenta-no-listas '(a d (e f) g))
(cuenta-no-listas '(8 (a b) (() (xy z))))
=> 0
=> 5
=> 5
28.- Denir un procedimiento intercambia-prof que haga lo mismo que el procedimiento
intercambia (ejercicio 13), pero en cualquier nivel.
(intercambia-prof 'a 'b '(c d b a b (a b) f))
(intercambia-prof 'a 'b '(((a) (b))))
(intercambia-prof '(1) '(2) '((1) ((1)) (2) ((2))))
4
=> (c d a b a (b a) f)
=> (((b) (a)))
=> ((2) ((2)) (1) ((1)))
29.- Denir un procedimiento inserta-izq-prof que tome dos datos x e y y una lista l y
devuelva la lista que resulta de insertar y a la izquierda de x , en todos los niveles.
(inserta-izq-prof 'd 'i ())
(inserta-izq-prof 'd 'i '(d (d) ((d))))
(inserta-izq-prof 'a 1 '(2 a (w a) d ((a) 6)))
=> ()
=> (i d (i d) ((i d)))
=> (2 1 a (w 1 a) d ((1 a) 6))
30.- Denir un procedimiento nivel que reciba un numero natural n y una lista l y
devuelva la lista de los elementos de l de nivel n .
(nivel 1 '(2 4 (i o u) b (bl) ((bla)) 0)) => (2 4 (i o u) b (bl) ((bla)) 0)
(nivel 2 '(2 4 (i o u) b (bl) ((bla)) 0)) => (i o u bl (bla))
(nivel 3 '(2 4 (i o u) b (bl) ((bla)) 0)) => (bla)
(nivel 4 '(2 4 (i o u) b (bl) ((bla)) 0)) => ()
31.- Denir un procedimiento min-max-it que haga lo mismo que el procedimiento minmax (ejercicio 3) y esté denido por recursión terminal.
32.- Denir un procedimiento aprox-lim-seno-it que haga lo mismo que aprox-lim-seno
(ejercicio 6) y esté denido por recursión terminal.
33.- Denir un procedimiento aprox-e-it que haga lo mismo que aprox-e (ejercicio 7) y
esté denido por recursión terminal.
34.- Denir un procedimiento acumulada que reciba una lista numérica plana l , no vacía,
y devuelva la lista obtenida al sustituir en l cada uno de sus elementos por la suma
de los elementos anteriores a él.
(acumulada '(1))
=> (1)
(acumulada '(4 3 2 1))
=> (4 7 9 10)
(acumulada '(2 4 5 10)) => (2 6 11 21)
35.- Denir un procedimiento mult-prof-it que realice lo mismo que el procedimiento
mult-prof (ejercicio 24) y esté denido por recursión terminal.
36.- Denir un procedimiento ocurre-prof-it que realice lo mismo que el procedimiento
ocurre-prof (ejercicio 23) y esté denido por recursión terminal.
37.- Denir un procedimiento lista-divisores , denido por recursión terminal, que reciba
un número natural n
en orden creciente.
(lista-divisores 6)
(lista-divisores 20)
(lista-divisores 16)
y devuelva la lista de sus divisores (incluido el 1 y excluido n),
=> (1 2 3)
=> (1 2 4 5 10)
=> (1 2 4 8)
38.- Denir un procedimiento cuenta-listas que reciba una lista l y devuelva el número
de listas que pertenecen a l , en cualquier nivel.
(cuenta-listas '(2 4 (i o u) b (bl) ((bla)) 0))
(cuenta-listas '(1 2 3 4 5))
(cuenta-listas '((((a)))))
5
=> 4
=> 0
=> 3
39.- Denir un procedimiento cuenta-planas que reciba una lista l y devuelva el número
de listas planas que son elementos de l , en cualquier nivel.
(cuenta-planas '(2 (f g) h (j k) 2))
(cuenta-planas '((a (b)) (5 (j o)) () 2))
(cuenta-planas '(1 2 3))
=> 2
=> 3
=> 0
40.- Denir un procedimiento ltra que reciba una lista numérica plana l y un número d ,
entre 0 y 100, y devuelva la lista de los elementos de l que se desvían como máximo
un d % de la media de l , es decir, los elementos x de l tales que
Ã
!
Ã
!
d
d
1−
M ≤x≤ 1+
M
100
100
donde M es la media de
(ltra '(1 2 3 4 5) 10)
(ltra '(1 2 3 4 5) 50)
(ltra '(1 2 3 4 5) 75)
los elementos de l .
=> (3)
=> (2 3 4)
=> (1 2 3 4 5)
41.- Denir un procedimiento mas-a-la-izq que reciba una lista l y devuelva el elemento
situado más a la izquierda de l .
(mas-a-la-izq '((a b) (c (d e))))
(mas-a-la-izq '((((c ((e f) g) h)))))
(mas-a-la-izq '(() a))
=> a
=> c
=> ()
42.- Denir un procedimiento mas-a-la-der que reciba una lista l y devuelva el elemento
situado más a la derecha de l .
(mas-a-la-der '((a b) (d (c d (f (g h) i) m n) u) v))
(mas-a-la-der '((((((b (c))))))))
(mas-a-la-der '(a ()))
=> v
=> c
=> ()
43.- Denir un predicado igual-estructura? que reciba dos listas l1 y l2 y devuelva #t
si las listas tienen la misma estructura y #f en caso contrario.
(igual-estructura? '(a (b (c d))) '(1 (2 (3 4))))
(igual-estructura? '(a (b (c d))) '(1 (2 3 4)))
(igual-estructura? '(a b c) '(1 2 3 4))
=> #t
=> #f
=> #f
44.- Denir un procedimiento min-prof que tome como argumento una lista numérica l ,
con al menos un número, y devuelva
nivel.
(min-prof '(1 (2) (3 ())))
(min-prof '((2)((3 4) -1)(0 ((1)))))
(min-prof '((-2) ((-2))))
el mínimo de los elementos de l , en cualquier
=> 1
=> −1
=> −2
45.- Denir un procedimiento injo->prejo que realice lo siguiente:
(injo->prejo
(injo->prejo
(injo->prejo
(injo->prejo
4)
'(2 + 3))
'(((5 ∗ 2) + 11) / 3))
'(7 − ((8 − 4) ∗ (2 − 5))))
6
=>
=>
=>
=>
4
(+ 2 3)
(/ (+ (∗ 5 2) 11) 3)
(− 7 (∗ (− 8 4) (− 2 5)))
46.- Denir un procedimiento prejo->injo que realice lo siguiente:
(prejo->injo
(prejo->injo
(prejo->injo
(prejo->injo
3)
'(+ 2 3))
'(− 7 (∗ (− 8 4) (− 2 5))))
'(/ (+ (∗ 5 2) 11) 3))
=>
=>
=>
=>
3
(2 + 3)
(7 − ((8 − 4) ∗ (2 − 5)))
(((5 ∗ 2) + 11) / 3)
47.- Denir un procedimiento marca-segun-nivel que reciba una lista l y devuelva la lista
obtenida sustituyendo cada elemento de l por un par punteado, formado por dicho
elemento y un número indicando su nivel en l .
(marca-segun-nivel ())
(marca-segun-nivel '(1 w 3))
(marca-segun-nivel '(w ((4) i) (((u)))))
=> ()
=> ((1 . 1) (w . 1) (3 . 1))
=> ((w . 1) (((4 . 3)) (i . 2)) ((((u . 4)))))
48.- Denir un procedimiento suma-valores que reciba una lista l1 , cuyos elementos, en
cualquier nivel, son pares punteados formados por un símbolo y un número, y una
lista de símbolos l2 y devuelva el número obtenido sumando los segundos elementos
de los pares de l1 cuyos primeros elementos estén en l2 .
(suma-valores '((uno . 1) (dos . 2)) '(tres dos))
(suma-valores '((a . 2) ((c . 1) (b . 3) ((d . 4)))) '(a d))
(suma-valores '((a . 2) ((c . 1) (b . 3) ((d . 4)))) '(e f))
49.-
=> 2
=> 6
=> 0
1. Denir un procedimiento prejo? que reciba dos listas l1 y l2 y devuelva #t
si los elementos de la lista l1 son los primeros de l2 y #f en caso contrario.
(prejo? '(1) '(1 2 6))
=> #t
(prejo? '(e i) '(e i o u))
=> #t
(prejo? '(e i) '(a e i o u)) => #f
2. Denir un predicado prejo-rep? que reciba una lista l y devuelva #t si l tiene
repetido el comienzo y #f en caso contrario.
(prejo-rep? '(1 2 3 1 2 3 4 5)) => #t [repite (1 2 3)]
(prejo-rep? '(a a e i o))
=> #t [repite (a )]
(prejo-rep? '(a e e i a))
=> #f
3. Decimos que una lista es buena si no contiene sublistas consecutivas iguales.
Denir un predicado lista-buena? que determine si una lista es buena o no.
(lista-buena? '(a e i o u))
=> #t
(lista-buena? '(a e i e i u)) => #f
(lista-buena? '(1 2 3 1 2)) => #t
50.- Decimos que una expresión expr es del tipo CP si es un número o una lista cumpliendo las siguientes condiciones:
• Está formada por tres elementos.
• El primero de ellos es uno de estos dos símbolos: s ó p .
• Los otros dos elementos son sendas expresiones del tipo CP.
7
Por ejemplo, (s 2 (p (s 5 2) 4)) es una expresión del tipo CP.
Denir un procedimiento calcula que reciba una expresión del tipo CP y devuelva
el resultado de evaluarla, habiendo sustituido s por + y p por ∗.
(calcula 3)
(calcula '(p 6 7))
(calcula '(s 2 (p (s 5 2) 4)))
=> 3
=> 42
=> 30
8