2012-04-24 52 views
1

我有一個列表CLISP:檢查兩個元素都在陸續爲了一個在列表中

L=(1 j 3 k 4 h 5 n 6 w) 

我需要做的功能驗證,將驗證,如果第一個原子是第二了。 我想驗證這一點:

> Verify(3 k) 

結果應該返回

> T 

//因爲原子 '3' 是原子 'K'

之前,在這種情況下:

>Verify(h 4) 

結果應該返回

> NIL 

//因爲原子「H」是原子後「4」

我要檢查每一個元素的位置和比較位置

您正在使用什麼方言的Lisp的
+0

這個問題的語法看起來不像Lisp。你在用什麼解釋器? – 2012-04-24 19:00:33

+0

@ÓscarLópez這不是一個LISP語法,它是一種我用來解釋我想要做的僞代碼 – Alex 2012-04-24 19:15:29

+0

好。在我的回答中,我試着保持中立,遵循評論中的指示,你應該能夠自己找到一個解決方案。對不起,我不能給你一個直接的答案,但它的功課... – 2012-04-24 19:22:14

回答

2

?下面是關於如何得到一個解決方案的一些三分球,填充了空白:

(define (verify lst a b) 
     ; what happens if there's only one element left in the list? 
    (cond ((null? (cdr lst)) <???>) 
     ; how do we check if the current element is equal to the `a` parameter 
     ; and the next element is equal to the `b` parameter? 
     (<???> T) 
     ; how do we continue traversing the rest of the list? 
     (else (verify <???> a b)))) 

;;; tests 

(define lst '(1 j 3 k 4 h 5 n 6 w)) 

(verify lst 3 'k) 
> T 
(verify lst 'h '4) 
> F 
1

這是一個班輪Common Lisp中:

(defun verify (list a b) 
    (member b (member a list))) 

注意它不返回T或NIL,但是「廣義布爾值」(除了nil之外的任何值都爲真)。這是Lisp語言的一個基本概念:

http://clhs.lisp.se/Body/26_glo_g.htm#generalized_boolean

這還假定「之前」的意思是「之前的任何地方」。你的家庭作業問題看起來可能與「之前」有關。應該很容易修改。

+0

我試過,但它沒有工作(defun定義驗證(名單AB) (成員B(成員列表))) (SetQ列表 '(1個3 5 AR 6 DY)) (驗證列表' R 5) 結果:Break 24 [26]> (5 6 DY) – Alex 2012-04-25 08:03:26

+0

'(5 6 DY)'是一個真正的結果,因爲它是一個不同於'nil'的對象。這是我在答案中提到的「廣義布爾」概念。廣義booelan意味着你可以做這個'(if(verify list'r 5)(format t「yes,it verified true!〜%」))''。 '(5 6 D Y)'對象將被'if'視爲真,因此'格式'被評估。這是在很多Lisp代碼中如何處理布爾值;你會浪費精力將它們轉換爲嚴格的't'和'nil'。 – Kaz 2012-04-25 08:11:00

+0

你可以用一個額外的'if'來把廣義布爾變成嚴格的't'和'nil',就像這樣:'(if generalized-boolean-expression t)'。如果表達式成立,則產生't'。(否則產生'nil':如果沒有'if'的第三個參數,這就是隱含的)。 – Kaz 2012-04-25 08:15:34

相關問題