CLISP:在列表中检查两个元素是否按顺序排列

时间:2012-04-24 18:20:01

标签: list lisp

我有一个清单

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

我需要做一个函数验证将验证第一个原子是否在第二个原子之前。 我想验证一下:

> Verify(3 k)

结果应该返回

> T

//因为原子'3'在原子'k'之前

在这种情况下:

>Verify(h 4)

结果应该返回

> NIL

//因为原子'h'在原子'4'之后

我必须检查每个元素的位置并比较位置

2 个答案:

答案 0 :(得分:2)

你使用什么方言的Lisp?以下是有关如何推导解决方案的一些指示,填写空白:

(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 :(得分: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

这也假定“之前”意味着“之前的任何地方”。你的作业问题看起来可能是“紧接着”。它应该很容易修改。