Guía programación funcional
Guía programación funcional
Los siguientes ejercicios deben ser pensados dentro del paradigma funcional. Pueden ser resueltos utilizando otros paradigmas pero el objetivo es el de lograr resolverlos utilizándolo, específicamente utilizando el lenguaje Scala. Para resolverlos se deben utilizar los conceptos y las herramientas vistas en clase, aunque puede ser necesario para resolverlos investigar otras herramientas por propia cuenta.
Ejercicios básicos
- Escribir una función
entreNumeros(inicio: Int, fin: Int): List[Int]
que retorne una lista que incluya todos los números enteros entre inicio y fin incluyéndolos. - Escribir una función
repetidos(lista1: List[Int], lista2: List[Int]): List[Int]
que retorne una nueva lista que contenga los elementos que están presentes en ambas listas. - Escribir una función
eliminarRepetidos(lista: List[Int]): List[Int]
que retorne una nueva lista que contenga los mismos elementos que la original pero sin elementos repetidos. - Escribir una función
aplicar(lista: List[Int], f: (Int, Int) =¿Int): List[Int]
que retorne una nueva lista que contenga los resultados de aplicar f a cada elemento de lista - Escribir una función
sumar(lista: List[Int]): Int
que retorne la suma de todos los elementos de la lista.
Ejercicios funciones impuras
Indicar y justificar cuales de las siguientes funciones son impuras
1.
def f ( x : Int , y : Int ) : Int = {
x + y
}
2.
def fecha () : String = {
LocalDate.now.format(DateTimeFormatter.ofPattern ("yyyyMMdd "))
}
3.
def contar(l: List[Int], e: Int): Int = {
var cont = 0;
l.foreach(elemento => {
if(elemento == e) {
cont = cont + 1
}
})
cont
}
4.
import scala.collection.mutable.Map
def actualizarAUno(mapa: Map[Int, Int]) = {
for (k, v) <- mapa do
mapa(k) = 1
}
5.
import scala.collection.mutable.Map
def randomEntre(a: Int, b: Int): Int = {
val rand = new scala.util.Random
rand.between(a, b)
}
6.
def merge[A](list1: List[A], list2: List[A]): List[A] = {
list1 ::: list2
}
7.
import java.io.PrintWriter
def guardarEnArchivo(texto: String, ruta: String): Unit = {
val escritor = new PrintWriter(ruta)
try {
escritor.write(texto)
} finally {
writer.close()
}
}
Ejercicios avanzados
Los ejercicios no están ordenados por complejidad.
- Escribir una función
contar(palabras: List[String]): Map[String, Int]
retorne un mapa donde las claves sean las palabras de la lista pasada por parámetro y los valores la cantidad de apariciones que tiene dicha palabra en la lista - Escribir una función
topK(numeros: List[Int], k: Int, f: (Int, Int) => Int): List[Int]
que retorne una lista con losk
elementos denúmeros
mas grandes según la funciónf
. La respuesta debe estar ordenada según el criterio de la funciónf
. - Definir la función
curry
, que dada una función de dos argumentos, devuelve su equivalente currificada. - Definir la función
uncurry
, que dada una función currificada de dos argumentos, devuelve su versión no currificada equivalente. Es la inversa de la anterior. - Generar la lista de los primeros mil números primos.
- Dado un texto, crear una función que tome el texto como entrada y devuelva un mapa que muestre la frecuencia de cada palabra en el texto. Los espacios no deben ser considerados
- Escribir una función que reciba un entero
n
y una listal
y retorne una lista con la diferencia de cada uno de la lista a n. Solo debe tener en cuenta los números para los cuales la diferencia es mayor a 10, ignorar el resto. - Escribir una función que junte los números de una lista sin usar métodos de ordenamiento. Ej: (1, 2, 3,4, 1, 3) => (2, 1, 1, 3, 3, 4).
- Escribir una función que retorne el n-esimo número de la sucesión de Fibonacci a partir de un número n.
- Escribir una función que reciba un string y retorne un booleano mostrando capicua o no.
- Escribir una función que retorne el máximo de una lista (no es valido usar la función reverse) utilizando
match
y luego sin utilizarlo.