Ruby 如何用递增的值填充数组
我正试图解决这个问题 我想创建一个方法,该方法接受一个整数,然后创建一个数组,其中包含它前面的所有整数以及整数本身作为数组中的值 以下是我到目前为止的情况。代码不起作用Ruby 如何用递增的值填充数组,ruby,arrays,project,Ruby,Arrays,Project,我正试图解决这个问题 我想创建一个方法,该方法接受一个整数,然后创建一个数组,其中包含它前面的所有整数以及整数本身作为数组中的值 以下是我到目前为止的情况。代码不起作用 def make_array(num) numbers = Array.new num count = 1 numbers.each do |number| numbers << number = count count = count + 1 end return num
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)
def make_数组(num)
numbers=Array.new num
计数=1
数字。每个都有数字|
数字(1..num)。在Ruby中,只需编写一个
1..num
将创建一个Range
对象,从1
开始,以num
的任何值结束Range
对象有一个to_
方法,通过枚举范围内的每个元素,将它们放大成真正的数组
在大多数情况下,实际上不需要数组
-范围
可以正常工作。这包括迭代(考虑到您正在处理的问题,我假设您需要迭代)
这就是说,知道如何“手工”创建这样一个数组
,这是非常宝贵的学习经验,因此您可能需要继续努力。提示:您希望以空数组([]
)开始,而不是以array.new num
,然后迭代num.times
,并将数字添加到数组中。如果您已经从一个大小为num
的数组开始,然后将num
元素推入其中,那么您将得到两个num
元素。如果像您的情况一样,您在迭代数组时添加元素,那么循环永远不会退出,因为对于您处理的每个元素,您都会添加另一个元素。这就像用磁铁的排斥面追逐一个金属球。要回答欧拉的问题:
(1 ... 1000).to_a.select{|x| x%3==0 || x%5==0}.reduce(:+) # => 233168
有时,我认为一行代码比更详细的代码更可读
假设您正在通过ProjectEuler上的示例学习Ruby,我将解释该行的作用:
(1 ... 1000).to_a
将创建一个数字为1到999的数组。欧拉问题要求数字低于1000。在一个范围内使用三个点将创建它,而不使用边界值本身
.select{|x| x%3==0 || x%5==0}
仅选择可除以3或5的元素,因此选择3或5的倍数。其他值将被丢弃。此操作的结果是一个只有3或5的倍数的新数组
.reduce(:+)
最后,此操作将把数组中的所有数字相加(或将其减少为)一个数字:解决方案所需的总和
我想说明的是:您每天手工编写的许多方法已经集成到ruby中,因为它是程序员为程序员编写的语言。务实一点;) 无法确定如何通过块代码,但是的,更改有效。感谢you@Ali-您可以使用的另一个类似方法是:1.upto(num).to_a
。我很感谢您的提示。干杯我对oneliner投了更高的票,但考虑到OP在用序列填充数组方面有困难,我相信功能性风格可能有点超出了他的头脑……用功能性风格思考永远都不为时尚早。在我们的大学里,我们甚至在任何命令式或OO语言之前学习了haskell。。。此外,编写表达式而不是一堆简单的指令应该有助于初学者阅读代码的实际功能,尤其是当代码库增长时。函数式风格就像是向数学家描述你的问题,命令式风格就像是给白痴下达指令:我同意,对于Haskell和Scheme。当您学习它们时,您将从模式/lambda和递归开始,并构建您的功能工具,以便了解它们的功能。Ruby虽然在功能上相当强大,但在语法和语义上都不如它精巧。您将永远不会像以前那样纯粹地开始,而是会进入标准库。要在Ruby中使用函数式,您需要了解块和可枚举的,:+
是一个符号,以及为什么符号可以作为reduce
的参数。。。让我注意到,。\u a
是浪费空间和时间的,因为选择
将直接作用于范围
:PYay,多亏了即将出现的注释,我没有想到:)我现在将它留在我的回答中,让OP清楚我使用了一个简单的数组结构。是的,我正在处理euler项目的问题,以便在Ruby中进行更舒适的编码。我喜欢极简主义代码,但在我的学习过程中,阅读一行代码片段有点让人困惑。谢谢你把它拆了。在过去的一周里,我一直在自学解决这些问题的基本方法。我偶尔阅读别人的解答,查找不熟悉的术语,但只有在自己解决问题之后。这总结了我在这一点上的学习策略。任何加速学习过程的提示都会受到欢迎。干杯