/* * Crear un método que reciba dos colecciones que implementen IEnumerable<T> * Y devuelva como resultado un IEnumerable<T> con los valores que coincidan en la misma posición. * Resolver el ejercicio utilizando ITERADORES (IEnumerator). * Probar enviando: * Un array de caracteres y un string. * Una lista de caracteres y un string. * Vuestra lista con caracteres y otra lista vuestra con caracteres. * El resultado se recorre en un foreach y se imprime elemento a elemento. */ //EJEMPLO EXAMEN public static IEnumerable<T> Coincidentes<T>(IEnumerable<T> vector1, IEnumerable<T> vector2) { IEnumerator<T> iterador1 = vector1.GetEnumerator(); IEnumerator<T> iterador2 = vector2.GetEnumerator(); IEnumerable<T> result = new List<T>(); while (iterador1.MoveNext() && iterador2.MoveNext()) { if (iterador1.Current.Equals(iterador2.Current)) result = result.Append(iterador1.Current); } return result; }
Ejercicios currificación (y aplicación parcial)
Find con currificación
//Ejercicio 1.. (No de examen, para ver el de examen justo el siguiente :D)//Implementar de forma currificada el método Buscar entregado en la sesión anterior.//Demostrar el uso de su invocación y de la aplicación parcial.public static T Find<T>(IEnumerable<T> collection, Predicate<T> predicate){ foreach (var item in collection) { if (predicate(item)) return item; } return default;}public static Func<Predicate<T>, T> FindCurrificado<T>(IEnumerable<T> collection)//, Predicate<T> predicate){ return predicate => { foreach (var item in collection) { if (predicate(item)) return item; } return default; };}
División
//Ejercicio 2. EXAMEN// Si - > 5 / 3 = 1 ; Resto = 2// Entonces -> 3 * 1 + 2 = 5;//Currifíquese la función y compruébese mediante el uso de la aplicación parcial el siguiente ejemplo:// Se sabe que la división: 20 / 6 = 3. Se desconoce el valor del resto.// Partiendo del valor 0, e incrementalmente, obténgase el resto.public static bool ComprobarDivision(int divisor, int dividendo, int cociente, int resto){ return dividendo == cociente * divisor + resto;}public static Predicate<int> ComprobarDivisionCurrificada1(int divisor, int dividendo, int cociente)//, int resto){ return resto => dividendo == cociente * divisor + resto;//return dividendo == cociente * divisor + resto;}public static Func<int, Predicate<int>> ComprobarDivisionCurrificada2(int divisor, int dividendo)//, int cociente)//, int resto){ return cociente => { return resto => dividendo == cociente * divisor + resto; };}public static Func<int, Func<int, Predicate<int>>> ComprobarDivisionCurrificada3(int divisor)//, int dividendo)//, int cociente)//, int resto){ return dividendo => { return cociente => { return resto => dividendo == cociente * divisor + resto; }; };}///-----------------------------------///// Probar en un Main con lo siguiente:///----------------------------------///// EJERCICIOS EXAMEN// Nota: en la versión currificada, el primer parámetro es lo que devuelve la división, el segundo es el dividendo, el tercero es el divisor y el cuarto es el restoConsole.WriteLine($"División sin currificar: {Ejercicio.ComprobarDivision(5, 3, 1, 2)}");Console.WriteLine($"División aplicación parcial 1: {Ejercicio.ComprobarDivisionCurrificada1(5, 3, 1)(2)}");Console.WriteLine($"División aplicación parcial 2: {Ejercicio.ComprobarDivisionCurrificada2(5, 3)(2)(1)}");Console.WriteLine($"División currificada: {Ejercicio.ComprobarDivisionCurrificada3(5)(2)(1)(3)}");//Ejemplo al revesConsole.WriteLine($"División currificada modificada: {Ejercicio.ComprobarDivisionCurrificada3(1)(5)(3)(2)}");// Se sabe que la división: 20 / 6 = 3. Se desconoce el valor del resto.// Partiendo del valor 0, e incrementalmente, obténgase el resto.int resto = 0;while (!Ejercicio.ComprobarDivisionCurrificada3(3)(20)(6)(resto)){ resto += 1;}Console.WriteLine($"resto de hacer 20/6: {resto}");
Ejercicios Clausuras
Número aleatorio inferior
/* Examen 21/22 EXAMENEjercicio 1 (A – 1,50 puntos). Dado un valor inicial, impleméntese una clausura que, en cada invocación, devuelva un número aleatorio inferior al anterior devuelto.Una vez llegue al valor cero y lo devuelva, el generador se reiniciará al valor inicial de forma automática. (B – 1,00 punto). Cree una versión del anterior que permita tanto reiniciar el generador de forma manual como modificar el valor inicial. Añádase código en el método Main para probar ambas versiones. */public static Func<int> MetodoAleatorioInferiorv1(){ Random random = new Random(); int _valor = 50; return () => { _valor = random.Next(0, _valor); return _valor; };}// Permite reiniciarpublic static void MetodoAleatorioInferiorv2(int inicial, out Action reset, out Func<int> get, out Action<int> modify){ Random random = new Random(); int _valor = inicial; reset = () => _valor = inicial; get = () => _valor = random.Next(0, _valor); modify = newValue => _valor = newValue;}///-----------------------------------///// Probar en un Main con lo siguiente:///----------------------------------///// EJERCICIOS EXAMEN// Ejercicio 1// Versión 1Func<int> aleatorio = Ejercicio.MetodoAleatorioInferiorv1();int val = aleatorio();while (val != 0){ Console.WriteLine(val); val = aleatorio();}Console.WriteLine(val);Console.WriteLine("Versión 2");// Versión 2Action<int> Modify;Action Reset;//get no recibe nada y devuelve un valorFunc<int> GetValorGenerador;Ejercicio.MetodoAleatorioInferiorv2(50, out Reset, out GetValorGenerador, out Modify);val = GetValorGenerador();while (val != 0){ Console.WriteLine(val); val = GetValorGenerador();}Console.WriteLine(val);Console.WriteLine("RESET");Reset();val = GetValorGenerador();while (val != 0){ Console.WriteLine(val); val = GetValorGenerador();}Console.WriteLine(val);Console.WriteLine("MODIFY 450");Modify(450);val = GetValorGenerador();while (val != 0){ Console.WriteLine(val); val = GetValorGenerador();}Console.WriteLine(val);
Fibonacci con clausuras
public static Func<int> GetFibonacciGenerator(){ int prev = 0, next = 1; // Inicializar los dos primeros números de la secuencia. // La clausura captura y recuerda 'prev' y 'next' entre llamadas. return () => { int current = prev; int newNext = prev + next; // Preparar para la siguiente llamada. prev = next; next = newNext; return current; };}///-----------------------------------///// Probar en un Main con lo siguiente:///----------------------------------///// Obtener un generador de Fibonacci.var fiboGenerator = GetFibonacciGenerator();// Generar y mostrar los primeros 10 números de Fibonacci.for (int i = 0; i < 10; i++){ Console.WriteLine(fiboGenerator());}
Bucle While con enfoque funcional
public static void BucleWhileFuncional(Func<bool> condicion, Action cuerpo) { if (condicion()) { cuerpo(); BucleWhileFuncional(condicion, cuerpo); } }///-----------------------------------///// Probar en un Main con lo siguiente:///----------------------------------///int i = 0; BucleWhile( () => i < 10, () => { Console.Write(i); i++; } );