# Generating sequence that uses the previous outcome for the current

I do not like to use while loops in Ruby. I was wondering how I can generate a "squared sequence" (e.g., squares the first input, then squares the outcome, etc.) in a more idiomatic Ruby way than this one:

value = 2
while value < 10000
puts value = value**2
end

# => 4
#    16
#    256
#    65536


I have a suspicion that there is a way/method to do this, but I do not know which one. I hope someone can point me in the right direction.

• You could also write, value = 2; loop do; break if value >= 10_000; puts value = value**2; end. – Cary Swoveland Jul 29 '14 at 5:18

Using while would be idiomatic in almost any language. while is basically the way to iterate, uh, while a condition is true. Hence the name - it's practically plain English.

You can postfix the while and save a couple of lines, but that's about it

puts value = value**2 while value < 10000


or use until if you want, but same difference

puts value = value**2 until value >= 10000


If you were dealing with a fixed or known number of iterations, you could do something like

4.times.inject(2) do |memo, _|
puts memo = memo ** 2
memo
end


but the whole point here is really that you don't know the number of iterations.

I see nothing wrong in using the while word since your function logically is doing smth while ...
Wolfram Mathematica has NestWhile, that can be implemented in Ruby like this:

def nest_while f, expr, test
expr = f[expr] while test[expr]
end

nest_while ->i{ (i**2).tap &method(:puts) }, 2, ->i{ i<10000 }

4
16
256
65536
=> nil


Also you might be interested in implementing NestWhileList: using yield like at SO: Are there something like Python generators in Ruby?. .