【发布时间】:2013-03-26 21:21:33
【问题描述】:
我正在制作一个 Common Lisp 函数来打印前 N 个素数。到目前为止,我已经设法编写了这段代码:
;globals
(setf isprime 1) ;if 1 then its a prime, 0 if not.
(setf from 1) ;start from 1
(setf count 0) ;should act as counter to check if we have already
; N primes printed
;function so far.
(defun prime-numbers (to)
(if (> count to) nil(progn
(is-prime from from)
(if (= isprime 1) (print from)(setf count (+ count 1)))
(setf isprime 1)
(setf from (+ from 1))
(prime-numbers to)))
(if (>= count to)(setf count 0) (setf from 1)))
;code to check if a number is prime
(defun is-prime(num val)
(if (< num 3) nil
(progn
(if (= (mod val (- num 1)) 0) (setf isprime 0))
(is-prime (- num 1) val))))
我的问题是,它不能正确打印 N 个素数。
如果我打电话给>(prime-numbers 10),
结果是:
1
2
3
5
7
11
13
17
19
1,
即它只正确打印了 9 个素数。
但是如果我打电话给>(prime-numbers 2)
结果是:1
2
3
5
7
1
我在这里做错了什么?这是我第一次用 LISP 编写代码。
更新:
(defparameter from 1)
(defparameter count 0)
(defun prime-numbers (to)
(if (> count to)nil
(progn
(when (is-prime from)
(print from)
(setf count (+ count 1)))
(setf from (+ from 1))
(prime-numbers to)))
(when (>= count to)
(setf count 0)
(setf from 1)))
(defun is-prime (n)
(cond ((= 2 n) t)
((= 3 n) t)
((evenp n) nil)
(t
(loop for i from 3 to (isqrt n) by 2
never (zerop (mod n i))))))
工作正常。但最后输出 NIL。
【问题讨论】:
-
请修正代码格式并去掉
defuns前面的反引号 -
CLISP 是编程语言“Common Lisp”的一种实现。
-
我重新缩进了你的第一个代码,没有触及第二个。那里有一些不恰当的缩进。
标签: printing numbers lisp primes clisp