On Sun, 2009-12-13 at 00:13 -0500, Jean-Pierre Chauvel wrote:
> Hoy durante la tarde, a fin de matar el aburrimiento, se me ocurrió
> intentar un cálculo lambda con cierto grado de complejidad, pero que
> permanezca elegante a la vez.
>
> La propuesta fue hallar el subconjunto de números primos dentro del
> conjunto definido por los n-ésimos primeros números de la secuencia
> Fibonacci.
>
> Todo un testamento del poder de Python:
>
> prime_fibonacci = \
> lambda size, a=0, b=1, result_set=[0]: \
> (size <= 1 and result_set) \
> or prime_fibonacci(
> size - 1, b, a + b,
> result_set + (
> (
> (
> lambda n: \
> not any(filter(
> lambda x: n % x == 0,
> range(2, int(n ** 0.5) + 1)))
> )(b) and [b]
> ) or []
> )
> )
>
> Para usar la función solo deben pasarle el parámetro del tamaño:
>
> >>> prime_fibonacci(46)
> [0, 1, 1, 2, 3, 5, 13, 89, 233, 1597, 28657, 514229, 433494437]
>
> Saludos,
>
> Jean-Pierre
La siguiente es una pequeña modificación que me tomó un tanto más de
tiempo pergeñar. Esta versión es más consistente, en el sentido de que
devuelve los n-ésimos números primos de la secuencia Fibonacci; en lugar
de devolver los números primos que se encuentren en los n-ésimos
primeros números de la secuencia Fibonacci.
Hay que tener mucho cuidado con el "tamaño" seleccionado para calcular.
Cualquier tamaño entre 0 y 14 es complétamente seguro, cifras mayores a
ese tamaño ocasionarían un efecto similar al de un forkbomb :P
prime_fibonacci = \
lambda size, a=0, b=1, result_set=[0], final=False: \
(
(not size or size == len(result_set)) \
and \
(
(final and result_set) \
or prime_fibonacci(
size, a, b,
filter(lambda n: \
not any(filter(
lambda x: \
n % x == 0,
range(2, int(n ** 0.5) +1)
)), result_set
), True)
)
) \
or prime_fibonacci(size, b, a + b, result_set + [b])
Saludos,
Jean-Pierre
_______________________________________________
Lista de correo Linux-plug
Temática: Discusión general sobre Linux
Peruvian Linux User Group (http://www.linux.org.pe)
Participa suscribiéndote y escribiendo a: [email protected]
Para darte de alta, de baja o hacer ajustes a tu suscripción visita:
http://listas.linux.org.pe/mailman/listinfo/linux-plug
IMPORTANTE: Reglas y recomendaciones
http://www.linux.org.pe/listas/reglas.php
http://www.linux.org.pe/listas/comportamiento.php
http://www.linux.org.pe/listas/recomendaciones.php