【问题标题】:Prime number check in LispLisp中的质数检查
【发布时间】:2021-06-11 11:19:03
【问题描述】:

有人可以在这里指出我的错误。我正在尝试检查一个数字是否是质数。 它在一定程度上有效,但我有一个语义错误。例如,它告诉我 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"))

【问题讨论】:

  • 嗨 Jeff,很高兴看到有人新学习 CL,但您应该查看 SO common-lisp 标签的信息选项卡中给出的一些参考资料以了解例如全局变量的使用。对于您关于素数检查的特殊问题,您可以在此处找到算法:https://rosettacode.org/wiki/Sieve_of_Eratosthenes#Common_Lisp

标签: functional-programming lisp common-lisp clisp


【解决方案1】:

很多事情都是错的。

如何使用素数测试,例如来自 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 测试素数。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我进行了一些调整,使代码变得更好,但我仍然遇到困难。可以看看吗?
    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多