2013-03-09 1 views
-1

Le titre indique à peu près tout.Vérifiez si une liste contient au moins un élément non nul

Je recherche quelque chose comme

(atleastonenonnil '(nil nil nil nil '(A B C))) 
=> T 

je pouvais le faire d'une manière récursive, mais je ne pouvais pas. Dois-je utiliser une fonction intégrée? J'utilise cLisp

+4

http://www.lispworks.com/documentation/HyperSpec/Body/f_everyc.htm#some –

+0

J'accepterais ce commentaire comme une réponse – Simbi

Répondre

2

Si vous traitez le premier élément de la liste alors tout le reste peut être fait récursivement. Le code est le suivant:

(defun at-least-one-nonnil (l) 
    (and (not (nullp l)) 
     (or (car l) 
      (at-least-one-nonnil (cdr l)))))) 

Bien sûr, dans ce cas simple, il existe déjà une fonction intégrée.

(defun at-least-one-nonnil-v2 (l) 
    (some #'identity l)) 

mais cela ne vous aide pas à connaître la récursivité.

+1

Ces deux fonctions ne sont-elles pas vraiment au moins à un zéro? Pour obtenir le comportement souhaité, vous devez supprimer le dernier de la première fonction et remplacer "#" not "par" # "identity' dans le dernier. En outre, Common Lisp utilise '(fonction defun (args) ...)' tandis que '(define (fonction args) ...)' est scheme. –

Questions connexes