Anda di halaman 1dari 15

INSTITUTO

TECNOLOGICO DE
ACAPULCO
PROGRAMACION LOGICA Y FUNCIONAL
PROFR: Dr. Jos A. Montero Valverde
14:00 - 15:00 Hrs.
EJERCICIOS UNIDAD II
ELABORADO POR:
Espinoza Prez Baltazar Bonilla 11320546
Ramos Jesus Alberto 10320110
Carrillo Calleja Erick Jerzain 11320154
Nieto Estevez Irving Israel 10320869
Garcia Salado Jesus Antonio 11320552
PROGRAMACION LOGICA Y FUNCIONAL 1
Ejercicio 3.1
Escriba una funcin aproxseno que, dados dos nmeros eps y x (el primero mayor que 0, el segundo
cualquiera), de como resultado el numero y con la propiedad de que
| sin x - y | < eps
Use la siguiente regla matematica:
(-1)^n * x ^(2*n+1) /(fromIntegral $ fac (2*n+1))
Escriba dos veces una definicin para aproxseno: una vez usando la funcin iterate y otra con until.
FUNCIN EMPLEADA PARA SU SOLUCIN
fact :: (Integral a) => a -> a
fact 0 = 1
fact n = n * fact (n - 1)
aproxseno x eps = head $ until (\(y:_)-> abs (sin x-y) < eps)
(\(fst:snd:tail) -> fst+snd:tail)
$ termsT x
termsT x= map (term x) [0..]
term x n= (-1)^n * x ^(2*n+1) /(fromIntegral $ fact(2*n+1))
aproxseno2 x eps= head $ dropWhile (\y-> abs (sin x-y) >= eps)
$ map head $ iterate (\(fst:snd:tail) ->
fst+snd:tail)
$ termsT x
Ejecucin:
PROGRAMACION LOGICA Y FUNCIONAL 2
Ejercicio 3.2
Escriba una funcin aproxlog que, dados dos nmeros eps y x (eps > 0, 1 < x _ 1),
devuelva un nmero y con:|log(1 + x) y| < eps
Use en la defnicin la funcin itrate o until, y use tambin la siguiente regla
matemtica:
log(1 + x) =1Xn=1((1)n+1xn/n).
FUNCIN EMPLEADA PARA SU SOLUCIN
potencia :: Float -> Float -> Float
potencia x n | n == 0.0 = 1.0
| n > 0.0 = x * potencia x m
where m = n - 1.0
loga2 :: Float -> Float -> [Float]
loga2 x n = (a*b)/n : loga2 x (n+1.0)
where a = potencia (negate 1.0) (n+1.0)
b = potencia x n
loga :: Float -> Int -> Float
loga a b = sum (take b (loga2 x 1.0))
where x = a-1.0
aproxlog :: Float -> Float -> Int -> (Float,Float,Int)
aproxlog x eps n
| a <= eps = (loga x n,log x, n)
| otherwise = aproxlog x eps (n+1)
where a = abs((loga x n) - (log x))
PROGRAMACION LOGICA Y FUNCIONAL 3
Ejecucin:
Ejercicio 3.3
Escriba una funcin aproxExp, que, dados dos nmeros reales eps y x (eps> 0),
devuelva un nmero y con |exy| < eps. Use la funcin itrate o la funcin until.
FUNCIN EMPLEADA PARA SU SOLUCIN
fac :: Float -> Float
fac n = !o"#ct $%&'&&n(
ot)nc*a :: Float -> Float -> Float
ot)nc*a + n , n == '&' = %&'
, n > '&' = + - ot)nc*a + .
/0)!) . = n - %&'
)+ + n = a12 : )+ + 3n4%&'5
/0)!) a = ot)nc*a + n
2 = fac n
a!o+E+ + )6 n
, a 7 )6 = 328)+ +8n5
, ot0)!/*6) = a!o+E+ + )6 3n4%5
/0)!) a = a2632 - 3)+ +5 5
2 = 6#. 3 ta9) n 3)+ + '&'55
Ejecucin:
PROGRAMACION LOGICA Y FUNCIONAL 4
Ejercicio 3.4
Que funcin f y que lista a cumplen la siguiente regla?
map (+1) . reverse = foldl f a
FUNCIN EMPLEADA PARA SU SOLUCIN
assert 3.4 f lst=(map (+ 1).reverse $ lst)
== (f lst)
probar 3.41 = assert 3.4 (foldl (\a b->b+1:a) []) [0,1,2,3]
esta funcin es la que se prueba
Ejecucin:
PROGRAMACION LOGICA Y FUNCIONAL 5
Ejercicio 3.5
Defina una funcin esta que controle si existe cierto elemento en una lista de elementos.
Defina la funcin de las siguientes maneras:
1. Tome todos los elementos iguales al elemento buscado y coloque estos en una lista.
Compruebe despus siesta lista esta vaca o no.
2. Haga una nueva lista en la que todos los elementos iguales al elemento buscado sean
reemplazados por 1 y los otros elementos por 0. Sume los elementos de la lista resultante y
compruebe si el resultado es igual a 0 o no.
3. Compruebe para cada elemento si es igual al elemento buscado o no. Despus
compruebe si uno de estos tests devolvio True.
FUNCIN EMPLEADA PARA SU SOLUCIN
PROGRAMACION LOGICA Y FUNCIONAL 6
esta 0 x lst = not.null.(filter (== x)) $ lst
esta 1 x lst = 0 < (sum $ map (\y->if y==x then 1 else 0) lst)
esta 2 x lst = or $ map (== x) lst
esta 3 x lst = any (== x) lst
Ejecucin:
Ejercicio 3.6
Escriba una funcin posiciones que devuelva una lista de indices de las posiciones de un
elemento determinado en una lista de elementos.
Por ejemplo:
? posiciones 4 [1,4,3,7,4,2]
[2,5]
? posiciones [3,5] [[3,6],[2,5]]
[]
PROGRAMACION LOGICA Y FUNCIONAL 7
FUNCIN EMPLEADA PARA SU SOLUCIN
posiciones x lst= let acc (i,is) y | x==y = (i+1,is++[i])
| otherwise=(i+1,is)
in snd $ foldl acc (0,[]) lst
Ejecucin:
Ejercicio 3.7
Escriba una funcin ndedc (numero de elementos distintos creciente), que dada una lista no
decreciente de nmeros, decida cuantos nmeros distintos hay en la lista.
FUNCIN EMPLEADA PARA SU SOLUCIN
PROGRAMACION LOGICA Y FUNCIONAL 8
ndedc:: (Eq a) => [a] -> Int
ndedc lista = let norep [] n=[n]
norep (x:xs) n | x == n = x:xs
| otherwise = n:x:xs
in length $ foldl norep [] lista
Ejecucin:
Ejercicio 3.8
Escriba una funcin nded (numero de elementos distintos), que, dada una lista cualquiera de
nmeros, devuelva cuantos nmeros distintos existen en la lista.
PROGRAMACION LOGICA Y FUNCIONAL 9
Una posibilidad de resolver este problema es contar solamente la primera ocurrencia de cada
numero en la lista.
FUNCIN EMPLEADA PARA SU SOLUCIN
nded :: (Eq a)=>[a]->Int
nded = length.nub
nded2::(Eq a)=>[a]->Int
nded2 = let cont (x,xs) y | elem y xs = (x,xs)
| otherwise = (x+1,y:xs)
in fst .(foldl cont (0,[]))
Ejecucin:
Ejercicio 3.9
Escriba una funcin segmento, que, dados una lista xs y dos nmeros i y j, devuelva una
sublista de xs desde el indice i+1 hasta el indice j.
PROGRAMACION LOGICA Y FUNCIONAL 10
No se puede usar el operador !!.
Antes de contestar esta pregunta, se debe especificar que pasa si j <= i, j > #xs y si i > #s.
FUNCIN EMPLEADA PARA SU SOLUCIN
segmento2 i j lst
| j > (length lst)=segmento i (length lst) lst
| i>=j = segmento j i lst
| otherwise= let acc (c,xs) x | c>=i && c<=j = (c+1,xs++
[x])
| otherwise = (c+1,xs)
in snd $ foldl acc (0,[]) lst
segmento:: Int -> Int -> [a] -> [a]
segmento i j lista | i >= j = segmento2 j i lista
| i < 0=segmento2 0 j lista
| j > l=segmento2 i l lista
| otherwise=take (j-i) (drop i lista)
where l=length lista
Ejecucin:
Ejercicio 3.10
PROGRAMACION LOGICA Y FUNCIONAL 11
Escriba una funcin esSegmento, que, dadas dos listas xs y ys devuelva True si xs es
segmento de ys, y False si no.
Una lista xs es sublista de ys cuando ys = hs ++ xs ++ ts, con hs, ts listas de cero o mas
elementos.
Se puede usar la funcin segmento del ejercicio anterior.
FUNCIN EMPLEADA PARA SU SOLUCIN
esSegmento xs ys
| length xs > length ys = False
| h1==h2 && xs == take (length xs) ys = True
| otherwise = esSegmento xs t2
where (h1:_,h2:t2)=(xs,ys)
esSegmento2 xs ys | length xs > (length ys) = False
| xs == take (length xs) ys = True
| otherwise = esSegmento2 xs (tail
ys)
Ejecucin:
PROGRAMACION LOGICA Y FUNCIONAL 12
Ejercicio 3.11
Escriba una funcin scdosa (sigue concatenando los dos anteriores), que, dadas dos listas xs
y ys del mismo tipo, devuelva una lista infinita de listas, con las siguientes propiedades:
*Los primeros dos elementos son respectivamente xs y ys.
*Para cada n > 0 el n+2-esimo elemento es la concatenacin del n-esimo elemento con el
+1-esimo elemento.
Use la funcin iterate.
FUNCIN EMPLEADA PARA SU SOLUCIN
scdosa xs ys =xs:(map last $ iterate (\lst -> lst++[(last.init $ lst)
++ (last lst)]) [xs,ys])
-- La buena
acdosa2 xs ys = map fst $ iterate (\(xs,ys)->(ys,xs++ys)) (xs, ys)
Ejecucin:
PROGRAMACION LOGICA Y FUNCIONAL 13
Ejercicio 3.12
Escriba una funcin sssp (sigue sumando el segmento previo), que, dada una lista finita de
nmeros ns con un tama:o k > 0, devuelva una lista infinita ms que cumpla con las siguientes
propiedades:
* ns = take k ms
* Para todo n >= k : ms!!(n+1) = (sum . drop (n-k) . take n) ms
FUNCIN EMPLEADA PARA SU SOLUCIN
sssp lst = let k=length lst
f xs=let n=length xs
in xs++[(sum.drop(n-k).take n) xs]
in init lst ++ (map last $ iterate f lst)
sssp2:: [Int] -> [Int]
sssp2 xs = xs ++ map fst ( iterate f (sum xs, xs) )
where f (suma, y:ys) = (sum zs, zs) where zs = ys ++ [suma]
-- La buena
sssp3 ns = map head (iterate f ns)
where f ns = (tail ns) ++ [sum ns]
PROGRAMACION LOGICA Y FUNCIONAL 14
Ejecucin:
PROGRAMACION LOGICA Y FUNCIONAL 15

Anda mungkin juga menyukai