需要帮助理解一行代码

时间:2017-01-12 00:27:32

标签: ruby

我一直在处理素数程序,我遇到了一些Ruby代码:

    (2..prime/2).none?{|i| prime % i == 0}

有人可以将这一点告诉我,并以简单的方式向我解释。如果你熟悉reddit EIL5。 (解释它就像我' 5。)

我在这里找到了代码:

How can I test if a value is a prime number in Ruby? Both the easy and the hard way?

3 个答案:

答案 0 :(得分:6)

即使效率很低,也很直接。它分解为:

# For each of the numbers in the range 2 to prime/2...
(2..prime/2).none? do |i|
  # ...test that none of them divide evenly with the given prime.
  # That is the modulus (%) of those two numbers is zero, or no
  # remainder from division.
  prime % i == 0
end

解决这个问题有更好的方法,但这种蛮力方法应该有效。

none?Enumerable中提到的众多便捷方法之一。它们可以处理Array和Hash对象,并提供有用的工具,用于将一组对象转换为另一组对象。

在这种情况下,它测试的是没有数字符合这些标准。这与any?all?相反,具体取决于您的要求。

答案 1 :(得分:2)

一些注释

变量名称

命名变量很难但非常重要。 正如其他人所提到的,你所展示的代码是测试一个数字是否为素数。

如果您使用prime作为此号码的变量名称,那么检查它是否为素数应该没有任何用处!

所以

(2..prime/2).none?{|i| prime % i == 0}

应该是

(2..number/2).none?{|i| number % i == 0}

为了使它更加明显,这段代码可以用一种方法编写:

def is_prime?(number)
  (2..number/2).none?{|i| number % i == 0}
end

此处?表示该方法返回一个布尔值。

none?

  • none?可以在任何Enumerable(Arrays,Hash和Array-like对象)上调用。
  • 必须与块一起使用。它使用每个元素一个接一个地执行此块。
  • 如果任何块返回nilfalse以外的值,none?会停止并返回false
  • 如果没有块返回真值,则返回true
  • none?相当于all?,条件相反。

示例:

puts [1, 3, 5, 7].none?{ |n| n.even? }
#=> true
puts [1, 3, 5, 7].all?{ |n| n.odd? }
#=> true
puts [1, 2, 3, 4, 5, 6, 7].none? { |n| n > 6 }
#=> false

优化

如果number % 2 == 0为false,则表示number为奇数。检查number/2是否划分number是没有用的,我们知道它也是false

这意味着范围太大了!可能是(2..number/3)

但如果数字不能被3整除,那么检查number是否可被number/3整除也毫无意义。

它一直持续到范围尽可能小:

(2..Math.sqrt(number))

这将使大数字的执行速度更快。

使用方法

def is_prime?(number)
  (2..Math.sqrt(number)).none? { |i| number % i == 0 }
end

p (2..100).select { |n| is_prime?(n) }
#=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

要检查它是否正确,我们可以使用Prime库:

require 'prime'
p (2..100).select { |n| is_prime?(n) } == Prime.take_while{|p| p<100 }
#=> true

答案 2 :(得分:0)

好的,露西,我希望你仔细听。如果你能理解我将要告诉你的内容,你可以吃一些洒上冰淇淋,然后和你的朋友一起玩。

昨天我们谈到了素数。你还记得他们是什么吗?不,露西,不是&#34;黄金时段&#34;数字,只是&#34;素数&#34;数字。但你是对的,素数是一个2或更多的自然数,并且可以被1整除,本身也没有其他数字。

假设您有一个号码并被要求确定它是否为素数,即它是否为素数。让我们说这个数字是35.如何回答这个问题呢?没错,你可以看看它是否可以被1和1以外的任何自然数整除。如果它可以被除1和35之外的数字整除,那么它就不是素数。如果它不是,它将是素数。好女孩!

好的,可以被2整除吗?是的,没错,35除以2是17.5,但这不是我的意思。我的意思是,它可以被2整除而没有余数吗?请记住,如果我们将35除以2,则余数表示为35%2,等于1.因此它不能被2整除.3怎么样?剩余部分,35%3,等于2,所以它不能被3整除。它也不会被4整除,因为35%4等于3.实际上,我们真的没有必要检查35是否是可以被4整除。你知道为什么吗?浓缩,露西。别忘了撒上冰淇淋。很好!如果它可被4整除,它也可以被2整除,因为2x2 = 4,但我们已经发现它不能被2整除。

35可被5整除吗?是!你已经知道了! 5次7确实是35,但我们也可以计算35%5 = 0,所以没有余数。这意味着35 是素数。得到它?是啊!

露西,在你拿到冰淇淋之前还有一个问题。假设数字是13而不是35,我们发现13不能被数字2,3,4,5和6整除。你能从中得出什么结论吗?我们下次要试试7吗?露西,你今天多么光明。除了数字本身之外,该数字不能被任何大于该数字一半的数字整除。除以这些数字中的任何一个的数字将等于零,其余为正数。所以,我们只需要考虑这个数字是否可以被2到2.5之间的任何数字整除。

好问题,露西!如果除以2的数字有余数,我们只是忽略余数。

好的,露西,你已经获得了冰淇淋,所以让我们把它拿出来。