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: