我目前正在通过浏览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