【发布时间】:2013-10-22 16:19:22
【问题描述】:
我正在学习 Ruby,参加伯克利的 MOOC,并且,在其中一些 MOOC 的家庭作业中,我们有一个练习说:
定义一个方法sum_to_n?它需要一个整数数组和一个 附加整数 n 作为参数,如果有两个则返回 true 整数数组中的元素总和为 n。一个空数组应该求和 根据定义归零。
我已经创建了两种可以完成这项工作的方法,但我对其中任何一种都不满意,因为我认为它们不是用 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
好吧,我希望你们能像我尝试的那样做一个更好、更漂亮的方法。
感谢您的帮助。
【问题讨论】:
-
通常情况下,我会厌倦在 Ruby 中使用
for,但在这种情况下,这是可以接受的,因为第二种方法的迭代次数将少于使用each。 -
虽然 Ruby 有
for,但我们倾向于忽略它,因为它有一些副作用,例如它会留下中间变量以使变量空间变得混乱,并迫使我们迭代容器使用计算的索引,而不是允许each单独传递每个项目。索引缺少第一个或最后一个元素,或者从末尾脱落,是所有语言中的常见错误,each有助于避免这种情况。因此,虽然它可能看起来像是一种风格选择,但它实际上是一种防御性编程选择。而且,欢迎来到 Stack Overflow! -
显然,伯克利的“大规模开放在线课程”正在引起人们对 SO 的极大兴趣 =)
标签: ruby-on-rails ruby arrays loops