递归函数lisp返回列表

时间:2015-02-13 07:28:15

标签: recursion lisp

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

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

我没有返回发生的次数,而是希望仅使用' o返回给定列表。

就像那样:

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

应该返回=> (o o o)

我不想使用poppushset ...只是我无法找回来。

1 个答案:

答案 0 :(得分:1)

请注意,给定出现次数,例如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))