在Ruby中组合方法

时间:2013-12-04 02:51:49

标签: ruby loops methods

为了加快我的计划,我正在尝试将这两种方法结合起来,但是我最难做到这一点。以下是方法:

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

2 个答案:

答案 0 :(得分:2)

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

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方法,特别是增量方法。

答案 1 :(得分:0)

我实际上会使用这段代码,而不是将两个函数组合在一起:

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秒