François Richard
François Richard

Reputation: 7055

Lisp recursive function, return list

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.

Upvotes: 1

Views: 854

Answers (2)

Pankaj Sejwal
Pankaj Sejwal

Reputation: 1595

You are very close,

(defun garde-o (liste)
 (cond ((not liste) nil)
  ((equal (car liste) 'o) (cons (car liste) (garde-o (cdr liste))))
  ((garde-o (cdr liste)))))

Usage: (garde-o '(a o x & w o )) => ( o o )

You just need to pick on your identified car.

Upvotes: 0

Paul Richter
Paul Richter

Reputation: 6311

Your current version returns a number which is incremented on each recursion. So your proposed version should work by building a list, extending it on each recursion.

Replace 0 with ‘(), and + 1 with cons ‘o.

Upvotes: 1

Related Questions