Ruby:继续添加数组中的每个值,直到达到最大设置值

时间:2017-06-30 18:07:52

标签: ruby

我无法想办法如何总结给定数组中的值,并在达到最大值时停止。与下面的示例一样,它应该只添加60和80.数组可能超过3个值。

def sum (array, max_value)
  #code here
end

puts sum([60, 80, 90], 200)

3 个答案:

答案 0 :(得分:3)

您始终可以使用inject

来限制它
def sum(array, max_value)
  array.inject do |s, v|
    s + v <= max_value ? s + v : s
  end
end

由于您可以控制向前链接的值,因此如果超过阈值,您可以停止添加总和。

修改:如果您正在寻找更长的列表中的内容:

def sum (array, max_value)
  array.inject do |s, v|
    break s if s + v > max_value

    s + v
  end
end

答案 1 :(得分:2)

add = ->(arr, max, current = 0) do
  val = arr.shift
  arr.empty? || val + current > max ? \
    current : add(arr, max, val + current)
end
add.([60, 80, 90], 200)
#⇒ 140

防止原始数组的变异,当通过引用传递时,应提前dup

arr, max = [60, 80, 90], 200
add.(arr.dup, max)

FWIW:不改变输入的解决方案:

add = lambda do |arr, max, current = 0, entry = true|
  arr = arr.dup if entry
  val = arr.shift
  arr.empty? || val + current > max ? \
    current : add(arr, max, val + current, false)
end

答案 2 :(得分:-1)

Ruby不是我的第一语言,但你可以做一个简单的循环:

def msum(arr,m)
    i=0
    sum=0
    arr.each do |e| 
        sum+=e
        break if sum>m
        i+=1
    end
    return arr.take(i)
end