我目前正在通過瀏覽ProjectEuler站點上的一些問題來學習LISP。其中一個問題問這樣的:找到主因子太慢或崩潰
的13195是5,7,13和29
號碼是多少600851475143的最大質因數的首要因素是什麼?
我已經一起報廢了Lisp代碼。但是,對於9位以上的數字,它非常緩慢。大多數情況下,我從來沒有得到一個解決方案,而對於8位數字,大約需要4-5秒。更何況,有時我會得到「HEAP超出」錯誤。
我的問題是我在運行代碼(使用Aquamacs)方面做錯了什麼?這些代碼可以通過哪些方式進行優化以更好地適應手頭的任務?更重要的是,如何避免「超過HEAP」碰撞?
代碼:
(defun potential-factors (number)
(loop for x from 1 to (ceiling (/ number 2))
for y = x
collect y))
(defun factors (number)
(let (prime-factors '())
(loop for x in (potential-factors number)
do (if (= (mod number x) 0)
(setq prime-factors (cons x prime-factors))))
prime-factors))
(defun is-prime (n &optional (d (- n 1)))
(if (/= n 1)
(or (= d 1)
(and (/= (rem n d) 0)
(is-prime n (- d 1))))()))
(defun problem-3 (number)
(last (sort (remove-if-not #'is-prime (factors number) :from-end t) #'<)))
谷歌「Eratosthenes篩」爲一種方式來製作素數列表。那麼你不必爲每個潛在因素做這麼昂貴的搜索。 – Barmar
@Barmar很好!謝謝! – MadPhysicist