【问题标题】:combine methods in Ruby [closed]在Ruby中组合方法[关闭]
【发布时间】:2013-12-20 09:10:05
【问题描述】:

为了加快我的程序,我正在尝试将这两种方法结合起来,但这样做最困难。方法如下:

def prime?(number, array)
  array.each do |x|
    if number % x == 0
      return false
    end
  end
  true
end

def sum_prime_2(number)
  i = 0
  prime = 1
  output = [2]
  while prime < number
    if prime?(prime, output)
      i += 1
      output << prime if prime != 1
    end 
    prime += 2
  end
  output.inject(:+)
end

这是我想出的,但它并不完全有效。我很乐意提供任何帮助。

def sum_prime(number)
  i = 0
  prime = 1
  output = [2]
  while prime < number
    if output.each { |x| prime % x == 0 } == true # prime? method
      output << prime if prime != 1
      i += 1
    end 
    prime += 2
  end
  output.inject(:+)
end

【问题讨论】:

  • 两行output 的意义何在,第一行紧跟在while prime &lt; number 之后,又在i += 1 之后?
  • 这与您上次[1]问这个问题有何不同? [1]:stackoverflow.com/questions/20365382/…
  • @Tin 感谢您的关注。我正在使用它们来查看发生了什么,但我删除了它们。

标签: ruby loops methods


【解决方案1】:

以下是您当前方法的简化:

def sum_primes(limit)
  primes = [2]
  n = 3
  while n < limit
    primes << n if primes.all? { |p| n % p != 0 }
    n += 2
  end
  primes.inject(:+)
end

但你可以做得更好。例如,不需要检查所有先前素数的整除性——只需要检查到n 的平方。更好的是sieve 方法,尤其是增量方法。

【讨论】:

  • 我刚刚做了一个快速的基准测试,这个版本实际上比原来慢了 30%!
  • 谢谢,这正是我想要的。我忘记了使用all?与块。我意识到有更快的方法可以做到这一点,但我对将它们结合起来特别感兴趣,你回答了这个问题。非常感谢。
  • 限制是一个比数字更好的变量名。谢谢。
【解决方案2】:

我实际上会使用这段代码,而不是结合这两个函数:

def prime?(number, array)
  array.each do |x|
    if number % x == 0
      return false
    end
    return true if x * x > number
  end
  true
end

sum_prime_2(100000)FMc 的答案与我的答案进行快速基准测试,原始代码大约需要 5.0 秒,FMc 需要 6.5 秒,但我的版本只需 0.1 秒。

【讨论】:

  • 对原始代码、您的代码或我对 OP 尝试方法的修改进行基准测试有点无关紧要——因为它们都是糟糕的算法。有点像动物园里的乌龟赛跑。如果我们真的关心大 N,那么通过蛮力可除性检查素数并不是要走的路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多