我有两个元素和一个列表每次第一个元素出现在给定列表的第一级时,我都必须在第一个元素之前插入第二个元素。
递归版本:

(defun INSERT-ELEM (E1 E2 L)
    (cond ((null L)  NIL)
       ((equal E1  (car L))  (cons E2 (INSERT-ELEM  E1 E2 (cdr L))))
       ((equal E2  (car L))  (cons E1 (INSERT-ELEM  E1 E2 (cdr L))))
       (t   (cons (car L) (INSERT-ELEM  E1 E2 (cdr L))))))

但有问题,它正在改变位置,而不是在E1前面插入E2。
有人能帮我吗?

最佳答案

有两个问题。
首先,您只需要在E2之前插入E1但是这句话:

   ((equal E2  (car L))  (cons E1 (INSERT-ELEM  E1 E2 (cdr L))))

E1之前插入E2你应该把它取下来。
第二个问题是,当进行递归调用时,结果中没有包含当前元素所以你要移除所有的E1元素将递归调用更改为:
(list* e2 (car l) (insert-elem e1 e2 (cdr l)))

工作版本为:
(defun insert-elem (e1 e2 l)
  (cond ((null l)  nil)
        ((equal e1  (car l))  (list* e2 (car l) (insert-elem  e1 e2 (cdr l))))
        (t   (cons (car l) (insert-elem  e1 e2 (cdr l))))))

(insert-elem 'a 'b '(1 2 3 a c b d a b e))
=> (1 2 3 b a c b d b a b e)

关于lisp - 在Element2之前插入Element1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44730084/

10-13 04:12