1

有没有办法使用地图重构这种方法?(此方法的目的是返回一个介于 1 和 max 参数之间的素数数组)

def primes(max)
  prime_arr = []
   (1..max).each {|i| prime_arr << i if is_prime?(i)}
  prime_arr
end

is_prime?(val) 返回真或假。

如果我将方法更改为:

def primes(max)
 (1..max).map {|i| i if is_prime?(i)}
end

当代码块失败时,返回的数组有一个 nil 值。

p primes(5)
#=> [1, 2, 3, nil, 5]

我知道我有什么工作,但如果有更好的方法,我宁愿不声明数组并专门返回数组

4

3 回答 3

2

Enumerable.reject(或)是过滤序列Enumerable.select的正确方法。

这些过滤器方法只查看返回值的真实性i,因此在这种情况下返回“有效”(i始终是真实值)时,返回值实际上被丢弃(不像map),因此谓词应该看起来更像:

c.reject {|i| !is_prime?(i)}

# or (inverting the double negative)
c.select {|i| is_prime?(i)}

# or (with &:)
c.select(&:is_prime?)

(请参阅&:后一种情况背后的魔力。)

此外,由于这涉及寻找素数,因此埃拉托色尼筛法可能是一本不错的读物。

于 2013-10-31T20:11:48.237 回答
1
require 'Prime'
MAX = 100
p Prime.each(MAX).to_a      #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31...
p (1..MAX).select(&:prime?) #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31...

如果要选择和转换,另一种方法是使用grep :

primes = ->x{x.prime?} # (new lambda syntax)
p (1..100).grep(primes){|x| x.to_s} #=> ["2", "3", "5", "7", "11", "13", "17",...
于 2013-10-31T20:30:38.687 回答
0

是的......我只是想出了一种方法来解释它,但请随时告诉我一个更好的方法!

def primes(max)
  (1..max).reject {|i| i if ! is_prime?(i)}
end
于 2013-10-31T20:05:02.823 回答