Lisp 中的质数检查

问题描述

有人能在这里指出我的错误吗?我想检查一个数字是否是素数。 它在一定程度上有效,但我有一个语义错误。例如,它告诉我 9 是质数,但同时它告诉我 4 和 6 不是质数,我很困惑。

(defvar *prime* nil)

(defun primeCheck (x y)
    (if (and (>= x y) (not (= (mod x y) 0))) 
        (progn 
            (setf y (+ y 1))
            (primeCheck x y)
            (setf *prime* 'yes))
    (setf *prime* 'no))
)
(primeCheck 9 2)
(if  (equal *prime* 'yes) (print "Number is prime") (print "Number is not prime"))

解决方法

我建议您下载一些 IDE(例如 LispWorks 个人版)或查找 Common Lisp 的在线 REPL 并在其中运行您的代码。你的错误:

  • ("prime number") 是格式错误的列表。将其替换为 (print "prime number")
  • primeCheck 调用一些(尚未)未定义的函数 modulus
  • (*prime-Check* nil) 是格式错误的列表。替换为 (setf *prime-Check* nil)
  • 格式错误的condand
  • 进行所有这些更正后,它不适用于 2、3、5 等。
,

很多事情都错了。

如何使用初级测试,例如来自 SICP(计算机程序的结构和解释)?

;; from SICP (here in clojure)
;; http://www.sicpdistilled.com/section/1.2.6/

(defun smallest-divisor (n)
  (find-divisor n 2))

(defun square (n)
  (* n n))

(defun find-divisor (n test-divisor)
  (cond ((> (square test-divisor) n) n)
        ((dividesp test-divisor n) test-divisor)
        (t (find-divisor n (1+ test-divisor)))))

(defun dividesp (a b)
  (zerop (mod b a)))

(defun primep (n)
  (= n (smallest-divisor n)))

primep 测试主要性。