消除lisp中的所有后续数字

时间:2017-04-24 19:42:47

标签: list lisp

我是lisp的新手,我在作业中遇到了一个问题,即要求消除所有后续数字,只有第一个数字会出现在列表中 例如(1 1 2 1 3 1 1 1)将为(1 2 1 3 1)

我的代码是:

;the input is (1 1 2 1 3 1 1 1)
 (defun eli(x)
   ; this condition will check if x is empty or has only one element
  (if (or(null x)(null (cdr x))) x 
    ; if the first element is 1 but the second element is not 1
    (if (and (= 1 (car x))(not (= 1 (car (cdr x)))))
         ; if true then append 1 and call the function with the rest of the list
        (cons (car x)(eli(cdr x)))
         ; if false call the function recursivaly
        (eli(cdr x))
      )))
         ; the output is (1 2 1 3 1 1)

此代码生成(1 2 1 3 1 1)

我知道哪里做错了?

1 个答案:

答案 0 :(得分:0)

你的问题是这个谓词:

(and (= 1 (car x))(not (= 1 (car (cdr x))))))

这只是检查第一个元素是1而第二个元素不是。您应该检查第一个元素是numberp,然后检查第一个元素是eql,然后跳过元素。