我的意思並不是聽起來粗魯,但你做需要讀取一個體面的Common Lisp教程;你的代碼更像是「你可以用任何語言編寫C」,與一些「我沒有得到動態可變填充」拋出。
要告訴你真正想要的,這裏是我會怎麼寫你的邏輯:
(defun prime (n)
(if (loop
for i from 2 to (sqrt n)
when (zerop (mod n i)) return nil
finally (return t))
"Numarul prim"
"Numarul nu este prim"))
測試:
CL-USER> (loop
for i from 2 to 20
do (format t "~a ~a~%" i (prime i)))
2 Numarul prim
3 Numarul prim
4 Numarul nu este prim
5 Numarul prim
6 Numarul nu este prim
7 Numarul prim
8 Numarul nu este prim
9 Numarul nu este prim
10 Numarul nu este prim
11 Numarul prim
12 Numarul nu este prim
13 Numarul prim
14 Numarul nu este prim
15 Numarul nu este prim
16 Numarul nu este prim
17 Numarul prim
18 Numarul nu este prim
19 Numarul prim
20 Numarul nu este prim
NIL
編輯1 - 使用局部變量:
(defun prime (n)
(let ((is-prime t))
(loop
for i from 2 to (sqrt n)
when (zerop (mod n i))
do (setf is-prime nil))
(if is-prime
"Numarul prim"
"Numarul nu este prim")))
EDIT 2 - 「我怎麼能概括所有這些素數」
讓我們回到一個真正的功能 - 在這種情況下,斷言表示一個數是素數(返回t
)或未被(返回nil
):
(defun prime (n)
(loop
for i from 2 to (sqrt n)
when (zerop (mod n i)) return nil
finally (return t)))
CL-USER> (prime 2)
T
CL-USER> (prime 3)
T
CL-USER> (prime 4)
NIL
和收集較低和上界之間的所有素數成列表的第二函數:
(defun primes (pfrom pto)
(loop
for i from pfrom to pto
when (prime i) collect i))
CL-USER> (primes 2 20)
(2 3 5 7 11 13 17 19)
,那麼你只需要
CL-USER> (reduce '+ (primes 2 20))
77
這裏是一個很好的Lisp介紹書。免費下載PDF文件: https://www.cs.cmu.edu/~dst/LispBook/ –