Advertisement
sagudelobe

Untitled

Sep 26th, 2023 (edited)
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.21 KB | None | 0 0
  1. import scala.math._
  2.  
  3. def filterMapDoble(inputList: List[Int], fnFiltro: Int => Boolean, f1: Int => Int, f2: Int => Int): (List[Int], List[Int]) = {
  4. // La idea de la función filtrar es tomar el primer elemento de la lista y situarlo
  5. // en la lista de salida apropiada, dependiendo si cumple o no con la función fnFiltro.
  6. // Luego la función se llama recursivamente con el "tail" de la lista de entrada.
  7.  
  8. def filtrar(l: List[Int], f: Int => Boolean): (List[Int], List[Int]) = {
  9.     if (!l.isEmpty) {
  10.     val matchValue = if (f(l.head)) List(l.head) else List[Int]()
  11.     val notMatchValue = if (f(l.head)) List[Int]() else List(l.head)
  12.  
  13.     (matchValue ::: filtrar(l.tail, f)._1, notMatchValue ::: filtrar(l.tail, f)._2)
  14.     } else (List[Int](), List[Int]())
  15. }
  16.  
  17. // La función applyFunctionToList evalúa la función g() para el primer elemento de
  18. // la lista, y lo concatena con la llamada recursiva a applyFunctionToList en donde
  19. // la lista de referencia es el "tail" de la lista del nivel anterior
  20. def applyFunctionToList(l: List[Int], g: Int => Int): List[Int] = {
  21.     if (!l.isEmpty) {
  22.     (List(g(l.head)) ::: applyFunctionToList(l.tail, g))
  23.     } else List[Int]()
  24. }
  25.  
  26. println(s"Lista de entrada: $inputList")
  27. // La función filterMapDoble inicia con la separación de la lista en dos,
  28. // de acuerdo a la fnFiltro.
  29. val filteredLists = filtrar(inputList, fnFiltro)
  30.  
  31. // Y finalmente se devuelve una tupla de listas en las cuales a la primera se le aplica
  32. // la función f1 y a la otra f2.
  33. val outputList1 = applyFunctionToList(filteredLists._1, f1)
  34. val outputList2 = applyFunctionToList(filteredLists._2, f2)
  35. println(s"Listas de salida: $outputList1, $outputList2")
  36. (outputList1, outputList2)
  37. }
  38. println("Parte 1: Programación funcional y recursiva en Scala")
  39.  
  40. // Probando el ejemplo del enunciado, se filtran las listas en el caso
  41. // de si el elemento es par o no; si es par, dividirlo entre 2; y si es impar, multiplicarlo por 2
  42. println("\nPrueba #1 - Implementando el ejemplo del enunciado")
  43. val testList = List(1, 3, 5, 7, 4, 6, 8)
  44. filterMapDoble(testList, x => x % 2 == 0, x => x / 2, x => x * 2)
  45.  
  46. // Probando las mismas funciones para un objeto de entrada Nil,
  47. // se puede observar que la salida es List(), List()
  48. println("\nPrueba #2 - Probando las funciones del enunciado para una lista de entrada Nil")
  49. val testList2 = Nil
  50. filterMapDoble(testList2, x => x % 2 == 0, x => x / 2, x => x * 2)
  51.  
  52. // Ahora pruebas adicionales con otras funciones
  53. def producto (f: (Int) => Int) (a: Int, b: Int): Int = {
  54.     if (a > b) 1
  55.     else f(a) * producto(f)(a+1, b)
  56. }
  57. def factorial (n: Int): Int = producto(x => x)(1, n)
  58.  
  59. println("\nPrueba #3 - Calcula factorial solo para los enteros positivos, negativos se convierten en cero")
  60. val testList3 = List(-3, -2, -1, 0, 1, 2, 3)
  61. filterMapDoble(testList3, x => x >= 0, factorial, x => 0)
  62.  
  63. val log2 = (x: Double) => log10(x)/log10(2.0)
  64. val isPowerOfTwo = (x: Int) => log2(x) % 2 == 0 || log2(x) % 2 == 1
  65.  
  66. println("\nPrueba #4 - Filtra los números que son potencia de 2, los que no lo son, se convierten a la potencia de 2 más cercana")
  67. val testList4 = List(2, 6, 7, 42, 33, 64, 1024, 743)
  68. filterMapDoble(testList4, isPowerOfTwo, x => x, x => pow(2, round(log2(x)).toDouble).toInt)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement