2012-02-29 21 views
12

En more ruby way of doing project euler #2, parte del código no esHacer algo infinitamente muchas veces con un índice

while((v = fib(i)) < 4_000_000) 
    s+=v if v%2==0 
    i+=1 
end 

es una manera de cambiar i += 1 en un estilo de programación más funcional construir?

Lo mejor que puedo pensar es

Float::MAX.to_i.times do |i| 
    v = fib(i) 
    break unless v < 4_000_000 
    s += v if v%2==0 
end 

porque no se puede llamar .times en un número de coma flotante.

+0

Lo que es 'Float' tiene que ver con ella en el primer lugar? Son todos enteros. –

+1

http://stackoverflow.com/questions/6373343/math-infinity-in-ruby-how-do-i-iterate-over-an-infinite-sequence –

+0

@DanielFischer: Porque no puedo encontrar un entero equivalente de FLOAT :: MAX. –

Respuesta

12

Numeric.step tiene parámetros predeterminados de infinito (el límite) y 1 (el tamaño del paso).

1.step do |i| 
    #... 
end 

Para la diversión, puede ser que incluso desee probar

1.step.size 
+0

FWIW lo anterior parece funcionar para Ruby 2.1 y 2.2 y superiores (No intenté 2.0) El equivalente de Ruby 1.9.3 es 1.step (Float :: INFINITY, 1) {| i | ...} – Gayle

10

Hay una predefinida (en 1.9.2) Float::INFINITY constante, por lo que se podría escribir

1.upto(Float::INFINITY) do |i| 
    ... 
end 

(También es posible usar Enumerator y take_while, convirtiendo el problema de adentro hacia afuera para que se vea más como Haskell o Python , pero take_while es codicioso y construye una matriz.)

Cuestiones relacionadas