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

Responder a