Ruby 以数组作为参数的函数

Ruby 以数组作为参数的函数,ruby,average,Ruby,Average,如何编写能够计算数组平均值的Ruby函数?如果数组没有任何元素,则结果应为0。我应该使用一个循环来实现。我是这样开始的,但我不太确定如何使用循环 a = [1, 2, 3, 4, 5, 6] def average(a) sum = 0.0 result = 0.0 if array.length > 0 then array.each do |item| sum += item end result = sum / array.len

如何编写能够计算数组平均值的Ruby函数?如果数组没有任何元素,则结果应为0。我应该使用一个循环来实现。我是这样开始的,但我不太确定如何使用循环

a = [1, 2, 3, 4, 5, 6]

def average(a)  
  sum = 0.0
  result = 0.0
  if array.length > 0 then
    array.each do |item|
      sum += item
    end
    result = sum / array.length
  end
  return result.to_f
end

我想我们也可以这样简单地写

a = [1, 2, 3, 4, 5, 6]
def average(arr=[])  
  sum = 0.0
  i=0
  while(i < arr.length) do
    sum += arr[i].to_f
    i += 1
  end
  return ((i==0) ? 0 : (sum / i))
end
a=[1,2,3,4,5,6]
def平均值(arr=[])
总和=0.0
i=0
而(i
我们可以用这种方法循环和计算总和。之后我们取i的值作为平均值,它将在循环后保留,并使用条件运算符返回结果

它的解决方案很简单,我还没有测试过它,所以可能会有错误。你可以在你这边试试。希望这有帮助

您可以这样写:

def average(values)
    total = 0.0

    values.each do |i| 
        total += i
    end

    return total / values.length()
end
如果要使用循环,可以通过以下方式执行:

def average(values=[])
    total = 0.0

    for i in values
        total += i
    end

    return total / values.length()
end
如果传递了非空数组,它将返回值的平均值。如果传递空数组,它将返回
0.0

您可以这样测试它:

puts average([1, 2, 3, 4, 5]) #=> "3"
puts average([]) #=> "0"
而不是使用你可以写

(arr.sum.to_f/arr.size).round(precision)

唯一不同的可能是你试图用一种方法来包装平均计算。我很困惑。。。这是什么意思?关于你的问题和可能的重复问题,“试图用一种方法来包装平均计算”是什么意思。如果你的练习指导令人困惑,最有可能帮助你的人是那些为确保你的练习指导不令人困惑而获得报酬的人,即助教/讲师/老师/教授。恐怕网络上的随机匿名者无法真正了解你导师的想法。当我遇到这样的练习时,我会简单地用几种不同的方法来解决它们,例如使用库方法、高阶函数、尾部递归和循环,然后讨论这4种方法的优缺点。谢谢你的帮助!“i=0”有哪个函数?只有一个度量值,“i”不是while循环的局部度量值,并且在外部可用,加上它初始化变量。我明白你的问题了吗?是的,我想我现在明白了。你能解释一下为什么在返回部分使用“?”吗?它是一个条件运算符吗这就像if..else..end block。如果“i”为0,则用于防止“设备为零”错误。如果“i”为0,则返回0,否则除以“i”得到平均值,该平均值将是浮点值,因为“和”是小数。如果您想了解更多关于条件运算符(也称为三元运算符)的信息,这是一个很好的答案:您是否真的运行了代码?它既不生成
“3”
也不生成
“0”
@Stefan这些都是它为我生成的结果。您的第二个示例与第一个示例相比,更像是一个循环<
中的/
的code>只是每个
的语法糖(变量绑定的语义稍有不同),因此您的两个示例大致相同。Ruby唯一实际的循环构造是
while
循环。@Davidthethird有趣的是,我得到
3.0
NaN
@JörgWMittag OP想要使用循环,所以我使用了一个循环示例。
(arr.sum.to_f/arr.size).round(precision)
def average(a)
  if a.empty?
    0
  else
    sum = a.inject(0.0){|x, sum| sum += x}
    sum / a.size.to_f
  end
end