2012-02-29 15 views
12

In more ruby way of doing project euler #2, parte del codice v'èFare qualcosa di infinitamente più volte con un indice

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

è un modo per cambiare i += 1 in uno stile di programmazione più funzionale costruire?

Il meglio che posso pensare è

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

perché non si può chiamare .times su un numero in virgola mobile.

+0

Cosa c'è di 'Float' ha a che fare con essa, in primo luogo? Sono tutti numeri interi. –

+1

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

+0

@DanielFischer: Perché non riesco a trovare un equivalente intero di FLOAT :: MAX. –

risposta

12

Numeric.step ha parametri predefiniti di infinito (il limite) e 1 (la dimensione del passo).

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

Per divertimento, si potrebbe anche voler provare

1.step.size 
+0

FWIW quanto sopra sembra funzionare per Ruby 2.1 e 2.2 e versioni successive (non ho provato 2.0) L'equivalente di Ruby 1.9.3 è 1.step (Float :: INFINITY, 1) {| i | ...} – Gayle

10

C'è un predefinito (in 1.9.2) costante Float::INFINITY, quindi si potrebbe scrivere

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

(Si potrebbe anche usare Enumerator e take_while, trasformando il problema dentro e fuori per farlo sembrare più simile a Haskell o Python , ma take_while è avido e crea un array.)

Problemi correlati