6

我正在尝试解决http://projecteuler.net/problem=1

我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。

以下是我到目前为止所拥有的。代码不起作用。

def make_array(num)
  numbers = Array.new num  
  count = 1

  numbers.each do |number|
    numbers << number = count
    count = count + 1
  end

  return numbers    
end

make_array(10)
4

2 回答 2

10

(1..num).to_a是您在 Ruby 中需要做的所有事情。

1..num将创建一个以任何值Range开始1和结束的对象numRange对象有方法通过枚举范围内的每个元素to_a来将它们炸毁。Arrays

对于大多数目的,您实际上并不需要Array-Range可以正常工作。这包括迭代(考虑到您正在处理的问题,这是我假设您想要的)。

也就是说,知道如何创建这样的Array“手工”是宝贵的学习经验,因此您可能需要继续努力。提示:你想从一个空数组 ( []) 开始,而不是从 . 开始Array.new num,然后迭代一些东西num.times,并将数字添加到Array. 如果你已经从一个Arraysize开始num,然后将num元素推入其中,你最终会得到两个num元素。如果像您的情况一样,您在迭代数组时添加元素,则循环永远不会退出,因为对于您处理的每个元素,您都会添加另一个元素。这就像用磁铁的排斥面追逐一个金属球。

于 2013-01-07T05:58:50.223 回答
2

回答欧拉问题:

(1 ... 1000).to_a.select{|x| x%3==0 || x%5==0}.reduce(:+) # => 233168

有时,单行代码比我认为的更详细的代码更具可读性。

假设您正在通过 ProjectEuler 上的示例学习 Ruby,我将解释该行的作用:

(1 ... 1000).to_a

将创建一个编号为 1 到 999 的数组。Euler-Question 想要低于1000 的数字。在 Range 中使用三个点将创建没有边界值本身的数组。

.select{|x| x%3==0 || x%5==0}

仅选择可被 3 或 5 整除的元素,因此是 3 或 5 的倍数。其他值被丢弃。此操作的结果是一个只有 3 或 5 倍数的新数组。

.reduce(:+)

最后,此操作会将数组中的所有数字相加(或将其减少为一个数字):解决方案所需的总和。

我想说明的是:很多你每天都要手工编写的方法已经集成在 ruby​​ 中,因为它是程序员为程序员设计的语言。务实;)

于 2013-01-08T10:01:49.220 回答