Proyecto Euler 2 en Mysql
By admin on Sep 5, 2009 | In Trucos avanzado | Send feedback »
Aquí está la pregunta 2 del Proyecto de Euler The Euler Project :
Cada nuevo número de la secuencia de Fibonaci se genera sumando los dos números que lo preceden.
Empezando por el 1 y el 2, los diez primeros números serán:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Hallar la suma de todos números pares de la secuencia de Fibonaci que no exceda de cuatro millónes.
Pues, en cuanto a una solución de Perl, tenemos el siguiente código
Code:
#!/usr/bin/perl | |
| |
@f=(1,2); | |
$sum=2; | |
while(($f=$f[0]+$f[1]) <= 4_000_000) { | |
shift @f; push @f,$f; | |
$sum+=$f if $f%2==0 } | |
print $sum, "\n"; | |
# Answer = 4613732 |
Vemos que el programa Perl se suma a $sum donde la variable $f es un número par, y los lazos hasta que el valor cambiado en la memoria (que se añade a cada valor anterior para producir la serie de Fibonacci) es superior a 4.000.000.
¿Cómo podemos lograr esto en MySQL? Una vez más (como en la primera entrada) vamos a utilizar variables para iterar. Con el fin de obtener la secuencia de Fibonacci se puede utilizar este...
Code:
set @varsum=1; | |
set @varadd=1; | |
set @var1=1; | |
set @var2=1; | |
| |
select @varsum:=@varadd+@varsum as fibonacci, | |
@varadd:=@var2, | |
@var2:=@varsum, orderid | |
from orders limit 40; |
(orders es una tabla que yo uso que tiene miles de filas).
Puse 40 en la cláusula de LIMIT después de un poco de ensayo y error. Recuerdes restaurar las variables cada vez que se ejecuta una consulta como esta.
A continuación, puede hacer una suma de los valores devueltos cuando el valor de Fibonacci es menos de 4 millones de dólares, mediante un INNER SELECT:
Code:
set @varsum=1; | |
set @varadd=1; | |
set @var1=1; | |
set @var2=1; | |
| |
select sum(fibonacci) from (select @varsum:=@varadd+@varsum as fibonacci,@varadd:=@var2,@var2:=@varsum, orderid from orders limit 40) tmp where fibonacci < 4000000; |
Pero estamos sumando todos los números haciendo esto - el problema dice que sólo debe sumar los números pares de la secuencia. Modificar fácilmente (véte la solución para el número 1) utilizando la función MOD:
Code:
set @varsum=1; | |
set @varadd=1; | |
set @var1=1; | |
set @var2=1; | |
| |
select sum(fibonacci) from | |
(select @varsum:=@varadd+@varsum as fibonacci, | |
@varadd:=@var2, @var2:=@varsum | |
from orders limit 40) tmp | |
where fibonacci < 4000000 | |
and mod(fibonacci,2)=0; | |
| |
+----------------+ | |
| sum(fibonacci) | | |
+----------------+ | |
| 4613732 | | |
+----------------+ | |
1 row in set (0.27 sec) |
Espero que este código es de utilidad para alguien.
Saludos, Mark
Feedback awaiting moderation
This post has 4 feedbacks awaiting moderation...
Leave a comment
| « enlaces | Proyecto Euler 1 en Mysql » |