问题
I know this is a newbie question I apologize in advance. I'm writing a recursive function which returns the number of 'o in a given list
(defun garde-o (liste)
(cond
((not liste) 0)
((equal (car liste) 'o) (+ 1 (garde-o(cdr liste))) )
((garde-o(cdr liste)) )
)
)
Instead of returning the number of occurence I would like to return the given list with only the 'o.
Like that:
(garde-o '(a o x & w o o))
should return => (o o o)
I don't want to use pop
,push
,set
... just I can't find of to return this.
回答1:
Notice that given the number of occurrences, for example 10, you can simply do
(make-list 10 :initial-element 'o)
or equivalently
(loop repeat 10 collect 'o)
To count the 'o in your list, you can do
(count 'o '(a b c o p o a z))
Thus, a simple solution for your function would be
(defun garde-o (a)
(make-list (count 'o a) :initial-element 'o))
However, you can do this recursively too
(defun garde-o (a)
(cond ((null a) nil)
((eq (car a) 'o) (cons 'o (garde-o (cdr a))))
(t (garde-o (cdr a)))))
and non-recursively
(defun garde-o (a)
(loop for x in a when (eq x 'o) collect x))
来源:https://stackoverflow.com/questions/28494515/recursive-function-lisp-return-list