递归函数 lisp return 列表

recursive function lisp return list

我知道这是一个新手问题我提前道歉。我正在编写一个递归函数,它 return 是给定列表中 'o 的数量

(defun garde-o (liste)
    (cond
        ((not liste) 0) 
        ((equal (car liste) 'o)  (+ 1 (garde-o(cdr liste)))   )
        ((garde-o(cdr liste))  )
    )
)

而不是 return 我想 return 给定的列表只有 'o.

像那样:

(garde-o '(a o x & w o o))

应该return=>(o o o)

我不想使用 poppushset...只是我找不到 return 这个。

请注意,给定出现次数,例如 10,您可以简单地执行

(make-list 10 :initial-element 'o)

或等同于

(loop repeat 10 collect 'o)

要计算列表中的 'o,您可以这样做

(count 'o '(a b c o p o a z))

因此,您的函数的一个简单解决方案是

(defun garde-o (a)
    (make-list (count 'o a) :initial-element 'o))

但是,您也可以递归地执行此操作

(defun garde-o (a)
    (cond ((null a) nil)
          ((eq (car a) 'o) (cons 'o (garde-o (cdr a))))
          (t (garde-o (cdr a)))))

和非递归

(defun garde-o (a)
    (loop for x in a when (eq x 'o) collect x))