ruby-on-rails - 如何使用 Ruby "Right Way!"创建嵌套循环?

标签 ruby-on-rails ruby arrays loops

我正在学习 Ruby,参加了伯克利的 MOOC,并且在其中一些 MOOC 的作业中,我们有一个练习说:

Define a method sum_to_n? which takes an array of integers and an additional integer, n, as arguments and returns true if any two elements in the array of integers sum to n. An empty array should sum to zero by definition.

我已经创建了两个可以完成这项工作的方法,但我对其中任何一个都不满意,因为我认为它们不是用 Ruby 方式编写的。我希望你们中的一些人可以帮助我了解哪种方法是正确的!

我制作的第一个方法在两次迭代中都使用了 each 方法,但我不喜欢这种方法的地方是每个数字都与其他每个数字相加,即使是相同的数字,做这样的事情:

arr[1, 2, 3, 4] => 1+1, 1+2, 1+3, 1+4, 2+1, 2+2, 2+3, 2+4, 3+1, 3+2... 4+3, 4+4

如您所见,有很多重复求和,我不希望这样。

这是代码:

def sum_to_n?(arr, n)
  arr.each {|x| arr.each {|y| return true if x + y == n && x != y}}
  return true if n == 0 && arr.length == 0
  return false
end

用另一种方法我得到了我想要的东西,只是几个总和,没有重复任何一个,甚至没有对相同的数字求和,但它看起来很可怕,我很确定有人会因为这样做而杀了我方式,但如您所见,该方法做得很好:

arr[1, 2, 3, 4] => 1+2, 1+3, 1+4, 2+3, 2+4, 3+4

这是代码:

def sum_to_n?(arr, n)
  for i in 0..arr.length - 1
    k = i + 1
    for k in k..arr.length - 1
      sum = arr[i] + arr[k]
      if sum == n
        return true
      end
    end
  end
  return true if n == 0 && arr.length == 0
  return false
end

好吧,我希望你们能像我尝试的那样尝试一种更好、更漂亮的方法,并从中获得乐趣。

感谢您的帮助。

最佳答案

我会这样写:

def sum_to_n?(arr, n)
  return true if arr.empty? && n.zero?
  arr.combination(2).any? {|a, b| a + b == n }
end

这似乎是一个漂亮的 Rubyish 解决方案。

关于ruby-on-rails - 如何使用 Ruby "Right Way!"创建嵌套循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19371442/

相关文章:

jquery - Rails Turbolinks 在单页上加载 javascript

ruby-on-rails - 禁用设备的 session

ruby-on-rails - 如何按时间订购

ruby-on-rails - 我似乎无法 grep 处理纯字符串

c - 在结构指针中访问动态内存

mysql - 数据结构

ruby-on-rails - Ruby Integer()、Array() 等——它们是什么?他们来自哪里?

python - 如何拆分 Python 列表的每个第 N 个元素

javascript - JavaScript 中的二维矩阵

ruby-on-rails - 如何使 Rails 3 Assets 的预编译速度更快?