def routine(n) puts n throw :done if n <= 0 routine(n-1) end catch(:done) do routine(3) end
def factorial(n)
raise ArgumentError, "factorial arg must be >= 0: #{n}" unless n >= 0
return 1 if n.zero?
(1..n).inject(1) { |product, i| product * i }
end
while true
print 'Enter a number (-1 to quit): '
n = gets.to_i
exit if n == -1
begin
puts "#{n}! = #{factorial(n)}"
rescue ArgumentError => e
puts e
end
end