gpt4 book ai didi

printing - 在 Common Lisp 中打印前 N 个质数

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:47 25 4
gpt4 key购买 nike

我正在编写一个 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。

最佳答案

首先,这里根本不需要使用全局变量。

使用真/假返回值。这将使您的 is-prime 函数类似于:

(defun is-prime (n)
(cond ((= 2 n) t) ;; Hard-code "2 is a prime"
((= 3 n) t) ;; Hard-code "3 is a prime"
((evenp n) nil) ;; If we're looking at an even now, it's not a prime
(t ;; If it is divisible by an odd number below its square root, it's not prime
(loop for i from 3 to (isqrt n) by 2
never (zerop (mod n i))))))

这样一来,该函数就不会依赖任何外部状态,也不会混淆任何东西。

其次,您看到的最后一个 1(可能)是函数的返回值。

要检查这一点,请尝试: (progn (prime-numbers 10) nil)

第三,重写您的 prime-numbers 函数以不使用全局变量。

第四,永远不要用setf创建全局变量或 setq , 使用 defvar or defparameter .在全局(实际上是“特殊”)变量上使用 *earmuffs* 也是(大多数情况下,但有些人不同意)的好方法。

关于printing - 在 Common Lisp 中打印前 N 个质数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15817350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com