我无法想办法如何总结给定数组中的值,并在达到最大值时停止。与下面的示例一样,它应该只添加60和80.数组可能超过3个值。
def sum (array, max_value)
#code here
end
puts sum([60, 80, 90], 200)
答案 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