[Ejercicio 2][Prueba 2020]

[Ejercicio 2][Prueba 2020]

de Carolina Burgos Paula -
Número de respuestas: 3

Buenas,

tratando de resolver el ejercicio 2 de la prueba 2020, no nos quedó claro el funcionamiento de la función tip. Ósea entendemos que tip tiene de parámetros una función f y tres listas xs, ys, zs, en donde: si las listas xs o ys vienen vacías, tip lo que va a devolver es reverse zs (que es la lista zs en orden inverso). Ahora en caso de que vengan: una función f,  xs, ys no sean vacías, tip lo que va a hacer sería llamarse recursivamente así misma con los parámetros: f, xs sin el primer elemento, ys sin el primer elemento, y en lugar de zs le va a pasar como parámetro f aplicada al primer elemento de ys y a x:zs no?. Podrían darnos un ejemplo de como sería en este caso?

Desde ya gracias!!

En respuesta a Carolina Burgos Paula

Re: [Ejercicio 2][Prueba 2020]

de Alberto Pardo -
Hola,

Esencialmente, lo que va haciendo tip f (que está definida de forma tail-recursiva) es ir recorriendo las listas xs e ys hasta que una (o ambas se agoten) y va acumulando en zs el resultado de aplicar f sobre la cabeza de ys e xs. Eso se expresa como (f (head ys) x : zs). Podriamos haber definido la segunda lista por pattern-matching de la forma (y : ys) y entonces habriamos escrito (f y x : zs).

Sabemos que al llegar a esa ecuación la 2da lista es no vacia porque ya pasamos por la ecuación anterior en que testeamos si la segunda lista es vacía. Por lo tanto, head ys y tail ys están definidas.

Al llegar a que una de las listas es vacía retorna el reverse del acumulador (la lista zs).

Veamos un ejemplo,
tip (+) [1,2,3] [4,5,6,7] [8,9]
= tip (+) [2,3] [5,6,7] [4+1,8,9]
= tip (+) [3] [6,7] [5+2,4+1,8,9]
= tip (+) [] [7] [6+3,5+2,4+1,8,9]
= [9,8,4+1,5+2,6+3]

que equivale a hacer reverse [8,9] ++ zipWith (+) [4,5,6,7] [1,2,3], que es una de las opciones que damos en el ejercicio. Como la función se va calculando en forma tail-recursiva el acumulador va dejando las sucesivas sumas en orden inverso. Al hacer reverse al final (cuando una de las listas se agota) las sumas pasan a estar en el orden en que se hicieron, lo que corresponde a la expresión zipWith (+) [4,5,6,7] [1,2,3]. A esto hay que sumarle que el valor inicial del acumulador (zs) queda adelante y en orden inverso.

Espero que esto haya aclarado la duda.

Saludos,
Alberto.
En respuesta a Alberto Pardo

Re: [Ejercicio 2][Prueba 2020]

de Carolina Burgos Paula -
Buenas Alberto,

muchas gracias, nos quedo claro como funciona tip. Creo que en su momento nos confundimos por la expresión: f (head ys) x : zs, que parecía que f se aplicaba a un elemento y una lista, y ahí nos entreverábamos.

Gracias por la pronta respuesta.
Saludos!
En respuesta a Carolina Burgos Paula

Re: [Ejercicio 2][Prueba 2020]

de Gustavo Chalela Nuñez -
Buenas, estaba con este ejercicio y me resultó que la opción b no termina (por lo que no sería equivalente al tip dado y sería la opción b la opción correcta, en vez de c). La opción b en mi versión es:
tip f xs ys zs es equivalente a reverse zs ++ tip f xs ys [ ]
¿Qué estoy haciendo mal? Transcribo mi razonamiento: Elegí una terna de listas xs = [1,2,3,4] ys = [5,6,7,8] y zs = [9,10,11,12]. Mi f = (^^).
Al aplicar reverse zs ++... me queda:
[12,11,10,9]++ tip (^^) [1,2,3,4] [5,6,7,8] [] -- queda tip f xs ys [] (las mismas xs e ys originales), o sea que
[12,11,10,9]++ []++tip (^^) [1,2,3,4] [5,6,7,8] [] -- esto se sigue repitiendo...
No se si hay algún error en la letra (que se aclaró al momento de la prueba, por ej x:xs en vez de xs) o estoy haciendo algo mal. En tal caso, ¿que estoy haciendo mal?
Muchas gracias