Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

martes, 18 de septiembre de 2018

El colador o la criba de Eratóstenes con Linq y recursivo

Ya antes había jugado con el colador de Eratóstenes, pero ahora toca hacerlo más pretencioso, menos legible y más recursivo :D
En total son tres intentos nada prácticos pero muy instructivos, pues voy a jugar un poco con funciones lambda recursivas:

// primer intento
Func<int, int> colador = null;
int[] nums = Enumerable.Range(2, 48).ToArray();

colador = n =>
{
    if (n == 8)
        return 0;
    else
    {
        nums = nums.Where(c => c == n || c % n != 0).ToArray();
        return colador(n + 1);
    }
};

colador(2);
nums.ToList().ForEach(c => Console.Write(c.ToString() + " "));

// el primer intento es una shit, modifica un array que está fuera de la función lambda.

// Acá viene el segundo intento:
Func<int, IEnumerable<int>, IEnumerable<int>> colador2 = null;
IEnumerable<int> nums2 = Enumerable.Range(2, 48);

colador2 = (n, x) =>
{
    if (n == 8)
        return x;
    else
    {
        x = x.Where(c => c == n || c % n != 0);
        return colador2(n + 1, x);
    }
};

nums2 = colador2(2, nums2);
Console.WriteLine();
nums2.ToList().ForEach(c => Console.Write(c.ToString() + " "));

// el segundo intento aún es demasiado legible.

// Acá va el tercer intento:
Func<int, IEnumerable<int>, IEnumerable<int>> colador3 = null;
IEnumerable<int> nums3 = Enumerable.Range(2, 48);

colador3 = (n, x) =>
{
    x = x.Where(c => c == n || c % n != 0);
    return (n < 8) ? colador3(n + 1, x) : x;
};

nums3 = colador3(2, nums3);
Console.WriteLine();
nums2.ToList().ForEach(c => Console.Write(c.ToString() + " "));

Console.ReadLine();



El resultado es: