要回答你最初的问题,所有你失踪是一个else
和而不是使用i++
你应该使用i += 1
。
def largestPrimeFactor (n)
i = 2
while i <= n
if n % i == 0
n /= i
else
i += 1
end
end
end
但是这段代码并不是非常“红宝石式”,所以我会提供一些我可能会用到的实现。
有没有必要计算这一点,因为红宝石已经有一种确定素因子的方法。只需要prime
这是ruby标准库的一部分。
require 'prime'
def largestPrimeFactor(n)
primes, _ = n.prime_division.transpose
primes.max
end
largestPrimeFactor(13195) # => 29
largestPrimeFactor(600851475143) # => 6857
唯一的缺点这种方法(以及你原来的JS代码)是,不使用一些所谓的记忆化所以调用largestPrimeFactor
有相当大量的多次可能会导致浪费计算。我们可以用我的解决方案的一个稍微复杂一点的版本解决这个问题:
require 'prime'
def largestPrimeFactor(number)
@largest_prime_factor ||= {}.tap do |hash|
hash.default_proc = proc do |_, key|
hash[key] = begin
primes, _ = n.prime_division.transpose
primes.max
end
end
end[number]
end
largestPrimeFactor(13195) # => 29
largestPrimeFactor(600851475143) # => 6857
当运行这些不同的实现W/benchmark
(也红宝石标准库的一部分),你可以看到巨大的进步
user system total real
JS port 0.030000 0.000000 0.030000 ( 0.036535)
without memozation 0.020000 0.000000 0.020000 ( 0.017466)
with memozation 0.000000 0.000000 0.000000 ( 0.000199)
没有阅读所有的代码,我可以告诉你,Ruby中没有'++'操作符。你将不得不做一些事情,比如'i + = 1' – saadq
随便看一眼就足以看到结构不匹配。您的Ruby代码中没有**其他**。 – meagar
请不要使用StackOverflow来询问您对同一网站(Odin项目)的每个问题。这是我见过的第四或第五,我认为有一两个人被关闭/删除。 – onebree