2016-01-24 52 views
-1

我試圖編寫一個lisp函數來測試一個數是否爲素數。我收到了lambda表達式錯誤(我已經搜索過以前回答過的與此有關的問題),但我找不到解決方案。代碼錯誤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") 
     ) 
) 

+4

這裏是一個很好的Lisp介紹書。免費下載PDF文件: https://www.cs.cmu.edu/~dst/LispBook/ –

回答

5

我的意思並不是聽起來粗魯,但你需要讀取一個體面的Common Lisp教程;你的代碼更像是「你可以用任何語言編寫C」,與一些「我沒有得到動態可變填充」拋出。

要告訴你真正想要的,這裏是我會怎麼寫你的邏輯:

(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"))) 

EDIT 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 
+0

好的。謝謝你的答案,但我需要做的像c風格算法沒有制動程序時,你只要找到一個分頻器,還需要包括如果測試在節目結束,但我不明白在lisp – JGF1994

+1

在C你會也從斷路器IIRC中斷開。我根據你的描述添加了一個版本,但我不會那樣做。 – uselpa

+0

我怎麼能summ所有這些素數的總和? – JGF1994