Arrays Ruby映射与压缩方法
给定一个数字Arrays Ruby映射与压缩方法,arrays,ruby,iterator,Arrays,Ruby,Iterator,给定一个数字n,我想返回它的阶乘(1*2*3…*n)。但是只有1和n之间的偶数 这是我现在的工作代码 def fact_even(n) arr = (1..n).map {|m| m if m % 2 == 0} new_arr = arr.compact new_arr.inject(&:*) end 给定块时,map返回一个新数组: [nil, 2, nil, 4, nil, 6] 之后我必须使用compact方法去除nils,然后使用inject获得阶乘的答案 有没
n
,我想返回它的阶乘(1*2*3…*n
)。但是只有1
和n
之间的偶数
这是我现在的工作代码
def fact_even(n)
arr = (1..n).map {|m| m if m % 2 == 0}
new_arr = arr.compact
new_arr.inject(&:*)
end
给定块时,map
返回一个新数组:
[nil, 2, nil, 4, nil, 6]
之后我必须使用compact
方法去除nil
s,然后使用inject
获得阶乘的答案
有没有办法让
map
返回一个只有偶数的数组,这样我就不必在下一行使用compact
?否则,有没有更有效的方法?尝试使用select
> (1..20).select { |r| r % 2 == 0}
=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
此外,您还可以尝试在下一行中使用reduce
:
> (1..20).select { |r| r % 2 == 0 }.reduce(:*)
=> 3715891200
尝试使用
选择
> (1..20).select { |r| r % 2 == 0}
=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
此外,您还可以尝试在下一行中使用reduce
:
> (1..20).select { |r| r % 2 == 0 }.reduce(:*)
=> 3715891200
您可以使用偶数?
而不是r%2==0
n = 20
(1..n).select { |r| r.even? }.reduce(:*)
# Output: => 3715891200
请注意,inject
和reduce
都指向相同的方法
Range.instance_method(:inject) == Range.instance_method(:reduce)
# Output: => true
您可以使用偶数?
而不是r%2==0
n = 20
(1..n).select { |r| r.even? }.reduce(:*)
# Output: => 3715891200
请注意,inject
和reduce
都指向相同的方法
Range.instance_method(:inject) == Range.instance_method(:reduce)
# Output: => true
Ruby 2.7添加了Enumerable#filter_map
。如果您使用的版本大于或等于2.7,您可以执行以下操作:
(1..n).filter_map { |m| m if m.even? }
但是,select
对于您的情况来说是一个更好的选择。Ruby 2.7添加了Enumerable\filter\u map
。如果您使用的版本大于或等于2.7,您可以执行以下操作:
(1..n).filter_map { |m| m if m.even? }
但是,select
对于您的案例来说是一个更好的选择