以下代码从1到n生成素数:
(defun prime-list(n)
(let ((a)(b)(x (floor (sqrt n))))
(loop for i from (floor n 6) downto 1 do
(push (1+ (* 6 i)) a)
(push (1- (* 6 i)) a))
(loop while (<= (car a) x) do
(push (car a) b)
(setf a (remove-if #'(lambda(m)(or (= 0 (mod m (car a))) (> m n))) a)))
(append '(2 3) (reverse b) a)))
Run Code Online (Sandbox Code Playgroud)
在我看来这部分
(setf a (remove-if #'XXX a))
Run Code Online (Sandbox Code Playgroud)
可以替换为
(delete-if #'XXX a)
Run Code Online (Sandbox Code Playgroud)
我希望这会让它变得更快.然而,当我进行更改时,函数现在进入无限循环并且永远不会返回.为什么?
我对Common Lisp的破坏性DELETE函数有点困惑.它似乎按预期工作,除非项目是列表中的第一项:
CL-USER> (defvar *test* (list 1 2 3))
*TEST*
CL-USER> (delete 1 *test*)
(2 3)
CL-USER> *test*
(1 2 3)
CL-USER> (delete 2 *test*)
(1 3)
CL-USER> *test*
(1 3)
Run Code Online (Sandbox Code Playgroud) 我正在阅读Practical Common Lisp.在第11章中,它说明了有关排序:
通常,在对序列进行排序后,您不会关心序列的未排序版本,因此在排序过程中允许
SORT和STABLE-SORT销毁序列是有意义的.但它确实意味着你需要记住写下面的内容:Run Code Online (Sandbox Code Playgroud)(setf my-sequence (sort my-sequence #'string<))
我尝试了以下代码:
CL-USER> (defparameter *a* #( 8 4 3 9 5 9 2 3 9 2 9 4 3))
*A*
CL-USER> *a*
#(8 4 3 9 5 9 2 3 9 2 9 4 3)
CL-USER> (sort *a* #'<)
#(2 2 3 3 3 4 4 5 8 9 9 9 9)
CL-USER> *a*
#(2 2 3 3 3 4 4 5 8 9 …Run Code Online (Sandbox Code Playgroud)