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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top