我可以使用.each方法来解决这个总和问题吗?

问题描述

还是Ruby的新手。新手问题,请忍受我。并提前谢谢您。 我喜欢while循环之类的.each方法。 while循环令我感到困惑。我喜欢.each方法的简洁性。我可以使用.each方法解决以下问题吗?我想弄清楚我是否可以使用此样式循环。

谢谢您的帮助!

 def sum_nums(max)



puts sum_nums(4) # => 10,because 1 + 2 + 3 + 4 = 10
puts sum_nums(5) # => 15

解决方法

是的,您可以使用.each方法来解决此问题。但是,拔头发不是办法。尝试在每个代码块外部将变量初始化为0,然后将代码块中的所有值添加到该变量。

,

所以要回答OP(并从所有其他答案中无耻地借用)

def sum_nums(n)
  (1..n).sum
end

puts sum_nums(5)
# => 15
,

以下是在Ruby中如何对1到n的所有数字求和的几种选择:

1.upto(4).reduce(:+) # => 10
1.upto(5).reduce(:+) # => 15

(1..4).reduce(:+) # => 10
(1..5).reduce(:+) # => 15

# could use `each`,but it is doing nothing here.
(1..4).each.reduce(:+) # => 10
(1..5).each.reduce(:+) # => 15

# same thing with `each`,but keeping track of the sum manually
sum = 0
(1..4).each do |i|
  sum += i
end
# i => 10

基本上,您会得到一个Enumerable(迭代器/集合抽象),该枚举跨越您要枚举的内容。在我们的例子中,我们希望从1到4。我们可以通过调用Integer#upto方法(如1.upto(4)或使用Range(如{{1} }。然后我们可以在集合/迭代器上使用任何Enumerable方法。

(1..4)只需为每个元素调用一个块(当调用时不带任何块,本质上什么都不做,只是返回相同的Enumerable),但是Enumerable也具有内置函数来查找最小值,最大值,减少值(在我们的例子中,我们正在求和,所以Enumerable#each适合),等等。有关更多详细信息,请参阅Enumerable文档。

,

一个想到的例子。

def sum_nums(max)
  sum = 0
  array = Array.new(max) { |i| (i + 1) }
  array.each { |element| sum += element }
  puts sum
end

sum_nums(4) # => 10
sum_nums(5) # => 15