我正在尝试编写一个lisp函数来测试一个数字是否为素数。我收到了lambda表达式错误(我已经搜索过以前回答的与此相关的问题),但我找不到解决方案。
(defun prime(n)
(
(defvar '(*ok* nil) (*i* nil) (*d* nil)
(setf *ok* 1)
(loop for *i* from 1 to (sqrt n) do
(
(if (= (mod n *d*) 0)
(setf *ok* 0))
)
)
(if (= *ok* 1)
(format t "Numarul prim")
(format t "Numarul nu este prim")
)
)
)
答案 0 :(得分:5)
我的意思是粗鲁,但你做需要阅读一个体面的Common Lisp教程;你的代码更像是"你可以用任何语言编写C语言,#34;用一些"我没有得到动态变量的东西"投入。
为了向您展示您真正想要的东西,请按照以下方式编写您的逻辑:
(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")))
编辑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