Faire quelque chose une infinité de fois avec un index
-
14-11-2019 - |
Question
Dans une façon plus rubis de faire le projet euler #2 , une partie du code est
while((v = fib(i)) < 4_000_000)
s+=v if v%2==0
i+=1
end
Y a-t-il un moyen de changer i += 1
dans une construction de style de programmation plus fonctionnelle ?
Le mieux auquel je puisse penser est
Float::MAX.to_i.times do |i|
v = fib(i)
break unless v < 4_000_000
s += v if v%2==0
end
parce que tu ne peux pas appeler .times
sur un nombre à virgule flottante.
La solution
Étape numérique a les paramètres par défaut de l'infini (la limite) et 1 (la taille du pas).
1.step do |i|
#...
end
Pour vous amuser, vous voudrez peut-être même essayer
1.step.size
Autres conseils
Il y a une constante prédéfinie (en 1.9.2) Float::INFINITY
, pour que tu puisses écrire
1.upto(Float::INFINITY) do |i|
...
end
(Vous pouvez également utiliser Enumerator
et take_while
, renversant le problème pour le faire ressembler davantage à Haskell ou Python, mais take_while
est gourmand et construit un tableau.)
Ruby 2.5 a introduit la gamme ouverte :
(1..).each do |i|
#...
end