Я делаю функцию 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.
defun
s - person sds   schedule 04.04.2013