Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 迭代数组并添加每个连续的数组值_Arrays_Ruby - Fatal编程技术网

Arrays 迭代数组并添加每个连续的数组值

Arrays 迭代数组并添加每个连续的数组值,arrays,ruby,Arrays,Ruby,我有一笔钱。我想从第一个值开始迭代数组,如果我加上下一个值,它等于amount,那么应该返回数组中的这两个值。如果它不等于该值,请尝试在该值之后添加下一个值,并检查它是否等于该值 然后返回值的数组,这些值加起来等于数量 范例 假设我有一个[1,2,3,4,7] 以及金额6 我知道我可以通过加1+2+3得到6,所以我想返回[1,2,3] 迭代数组的开头,然后检查下一个是否等于6,如果不等于6,试着加上下一个,然后看到它等于6…以此类推,直到我得到的值加在一起等于6 换言之,在这个数组中找到加在一起

我有一笔钱。我想从第一个值开始迭代数组,如果我加上下一个值,它等于amount,那么应该返回数组中的这两个值。如果它不等于该值,请尝试在该值之后添加下一个值,并检查它是否等于该值

然后返回值的数组,这些值加起来等于数量

范例

假设我有一个
[1,2,3,4,7]
以及金额
6

我知道我可以通过加1+2+3得到6,所以我想返回
[1,2,3]

迭代数组的开头,然后检查下一个是否等于6,如果不等于6,试着加上下一个,然后看到它等于6…以此类推,直到我得到的值加在一起等于6

换言之,在这个数组中找到加在一起构成6的值。

试试这个:

array = [1,2,3,4,7]
amount = 17

master_array = (1..array.size).map { |i| array.each_slice(i).to_a }

master_array.each.with_index do |e,i| 
  p e[0] if master_array[i][0].inject(:+) == amount
end
情况1:要求和的元素是数组的第一个
n
元素

def sum_subarrays(arr, tot)
  (0...arr.size).each do |n| 
    b = arr.combination(n).find { |a| a.reduce(:+) == tot }
    b ? (return b) : nil
  end
  nil
end

(1..17).each do |tot|
  v = sum_subarrays(arr, tot)
  puts "sum_subarrays(arr, #{tot}) = #{v ? v : 'nil'}"
end
sum_subarrays(arr, 1)  = [1]
sum_subarrays(arr, 2)  = [2]
sum_subarrays(arr, 3)  = [3]
sum_subarrays(arr, 4)  = [4]
sum_subarrays(arr, 5)  = [1, 4]
sum_subarrays(arr, 6)  = [2, 4]
sum_subarrays(arr, 7)  = [7]
sum_subarrays(arr, 8)  = [1, 7]
sum_subarrays(arr, 9)  = [2, 7]
sum_subarrays(arr, 10) = [3, 7]
sum_subarrays(arr, 11) = [4, 7]
sum_subarrays(arr, 12) = [1, 4, 7]
sum_subarrays(arr, 13) = [2, 4, 7]
sum_subarrays(arr, 14) = [3, 4, 7]
sum_subarrays(arr, 15) = [1, 3, 4, 7]
sum_subarrays(arr, 16) = [2, 3, 4, 7]
sum_subarrays(arr, 17) = nil
效率不高,但读起来很好:

更有效率:

使用递归

情况2:要求和的元素可以是数组的任何元素

def sum_subarrays(arr, tot)
  (0...arr.size).each do |n| 
    b = arr.combination(n).find { |a| a.reduce(:+) == tot }
    b ? (return b) : nil
  end
  nil
end

(1..17).each do |tot|
  v = sum_subarrays(arr, tot)
  puts "sum_subarrays(arr, #{tot}) = #{v ? v : 'nil'}"
end
sum_subarrays(arr, 1)  = [1]
sum_subarrays(arr, 2)  = [2]
sum_subarrays(arr, 3)  = [3]
sum_subarrays(arr, 4)  = [4]
sum_subarrays(arr, 5)  = [1, 4]
sum_subarrays(arr, 6)  = [2, 4]
sum_subarrays(arr, 7)  = [7]
sum_subarrays(arr, 8)  = [1, 7]
sum_subarrays(arr, 9)  = [2, 7]
sum_subarrays(arr, 10) = [3, 7]
sum_subarrays(arr, 11) = [4, 7]
sum_subarrays(arr, 12) = [1, 4, 7]
sum_subarrays(arr, 13) = [2, 4, 7]
sum_subarrays(arr, 14) = [3, 4, 7]
sum_subarrays(arr, 15) = [1, 3, 4, 7]
sum_subarrays(arr, 16) = [2, 3, 4, 7]
sum_subarrays(arr, 17) = nil

我不知道该怎么做我对ruby还不熟悉,也没有什么好主意。这是查找语言的第一天,请看一下算法的详细信息。有一个很短的递归解决方案。好的,thx,我现在用数组
[1,2,3,4,7]
和值
6
,你如何决定返回
[1,2,3]
,而不是
[1,1,1,3]
[1,1,1,1,1,1]
?@Jordan不知道,非常好的问题:)一个我正在试图弄清楚什么是p[0]?我对ruby不太熟悉syntax@WTF
p
inspect
方法的快捷方式。与数组一起使用时,它返回数组。与
put
比较,后者将打印数组的每个元素并返回
nil
。在本例中,
e
表示迭代中的当前元素,它也是一个数组。e[0]表示法打印索引为0的数组元素。考虑数组<代码> e=(1, 2, 3)< /代码>,然后<代码> e [ 0 ]=1 < /代码>,<代码> e [ 1 ]=2 < /代码>和<代码> E[2 ]=3 < /代码>。老实说,我对案例1的解决方案有点过于复杂。CarySwoveland有一个更干净、更容易阅读案例1的解决方案。显然他考虑了更复杂的案例2。
t = 0
idx = arr.size.times.find { |i| t += arr[i]; t == tot }
idx ? arr[0..idx] : nil
  #=> [1, 2, 3]
def partial_sum(arr, remaining)
  return nil if arr.empty?
  first, *rest = arr
  if remaining == first
    [first]
  else
    ret = partial_sum(rest, remaining-first)
    ret ? [first, *ret] : nil
  end
end

partial_sum(arr, 6)
  #=> [1, 2, 3]
partial_sum(arr, 7)
  #=> nil
def sum_subarrays(arr, tot)
  (0...arr.size).each do |n| 
    b = arr.combination(n).find { |a| a.reduce(:+) == tot }
    b ? (return b) : nil
  end
  nil
end

(1..17).each do |tot|
  v = sum_subarrays(arr, tot)
  puts "sum_subarrays(arr, #{tot}) = #{v ? v : 'nil'}"
end
sum_subarrays(arr, 1)  = [1]
sum_subarrays(arr, 2)  = [2]
sum_subarrays(arr, 3)  = [3]
sum_subarrays(arr, 4)  = [4]
sum_subarrays(arr, 5)  = [1, 4]
sum_subarrays(arr, 6)  = [2, 4]
sum_subarrays(arr, 7)  = [7]
sum_subarrays(arr, 8)  = [1, 7]
sum_subarrays(arr, 9)  = [2, 7]
sum_subarrays(arr, 10) = [3, 7]
sum_subarrays(arr, 11) = [4, 7]
sum_subarrays(arr, 12) = [1, 4, 7]
sum_subarrays(arr, 13) = [2, 4, 7]
sum_subarrays(arr, 14) = [3, 4, 7]
sum_subarrays(arr, 15) = [1, 3, 4, 7]
sum_subarrays(arr, 16) = [2, 3, 4, 7]
sum_subarrays(arr, 17) = nil