Arrays Ruby中的CoderByte数组加法I-工作代码和非工作代码之间的差异

Arrays Ruby中的CoderByte数组加法I-工作代码和非工作代码之间的差异,arrays,ruby,addition,Arrays,Ruby,Addition,这是针对CoderByte提出的阵列添加问题: 使用函数ArrayAdditionI(arr)获取存储在arr中的数字数组,如果数组中的任何数字组合相加等于数组中的最大数字,则返回字符串true,否则返回字符串false 例如:如果arr包含[4,6,23,10,1,3]则输出应返回true,因为4+6+10+3=23。数组不会为空,不会包含所有相同的元素,并且可能包含负数 我想知道为什么会这样: def ArrayAdditionI(arr) sum = [] largest = ar

这是针对CoderByte提出的阵列添加问题: 使用函数
ArrayAdditionI(arr)
获取存储在arr中的数字数组,如果数组中的任何数字组合相加等于数组中的最大数字,则返回字符串true,否则返回字符串false

例如:如果
arr
包含
[4,6,23,10,1,3]
则输出应返回true,因为
4+6+10+3=23
。数组不会为空,不会包含所有相同的元素,并且可能包含负数

我想知道为什么会这样:

def ArrayAdditionI(arr)
  sum = []
  largest = arr.sort!.pop
  1.upto(arr.count) do |i|
    arr.combination(i).to_a.each do |subarr|
      sum << subarr.inject(:+)
    end
  end

  sum.include?(largest)
end
或者为什么这不会:

def ArrayAdditionI(arr)
  1.upto(arr.count) do |i|
      arr.combination(i).to_a.each do |subarr|
      return true if arr.sort!.last == subarr.inject(:+)
    end
  end

  false
end
def ArrayAdditionI(arr)
  sorted_arr = arr.sort
  1.upto(arr.count) do |i|
    arr.combination(i).to_a.each do |subarr|
      return true if  sorted_arr.last == subarr.inject(:+)
    end
  end

  false
end
我想强调代码之间的一些关键点和差异。在有效的代码中,一个空数组被分配给“sum”。数组中最大的数字被分配给变量“maximust”。要检查最大的数字是否等于任何一个和,调用
.include?
方法。我想通过排序和调用数组中的最后一个整数,尝试从块中访问最大的整数,但这似乎不起作用


我试过口头测试用例,但我似乎不知道代码出了什么问题。有什么隐含的东西我只是不了解吗?

有一点很重要,那就是在进行比较之前删除数组中最大的元素

请注意,在工作代码中,这发生在迭代之前:

largest = arr.sort!.pop
pop是一种破坏性的方法;它将更改
arr
的值

在您的尝试中,每次的结果都是
true
。我怎么知道?当
i
为1时,
组合(i)
将是长度为1的数组。实际上,原始数组中的每个元素都将与最大值进行比较。如果最大元素仍包含在数组中,则在某个时候您将运行:

return true if <maximum> == [<maximum>].inject(:+)
如果==[]返回true。注入(:+)

这永远都是事实

有一点很重要,那就是在进行比较之前删除数组中最大的元素

请注意,在工作代码中,这发生在迭代之前:

largest = arr.sort!.pop
pop是一种破坏性的方法;它将更改
arr
的值

在您的尝试中,每次的结果都是
true
。我怎么知道?当
i
为1时,
组合(i)
将是长度为1的数组。实际上,原始数组中的每个元素都将与最大值进行比较。如果最大元素仍包含在数组中,则在某个时候您将运行:

return true if <maximum> == [<maximum>].inject(:+)
如果==[]返回true。注入(:+)

这永远都是事实

大坝!这帮了大忙!非常感谢@max!大坝!这帮了大忙!非常感谢@max!