要回答你最初的問題,所有你失蹤是一個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