2013-03-09 122 views
-1

標題幾乎可以告訴所有事情。檢查列表是否包含至少一個非零元素

我正在尋找類似

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

我可以在一個遞歸的方式做到這一點,但我不能。我應該使用一些內置功能嗎? 我正在使用cLisp

+4

http://www.lispworks.com/documentation/HyperSpec/Body/f_everyc.htm#some – 2013-03-09 18:29:53

+0

我會接受該評論作爲答案 – Simbi 2013-04-06 07:47:59

回答

2

如果您處理列表的第一個元素,那麼其餘所有內容都可以遞歸執行。代碼是這樣的:

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

當然在這種簡單的情況下,已經有一個內置函數。

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

但這並不能幫助你瞭解遞歸。

+1

這兩個函數實際上是不是至少一個零?爲了得到所需的行爲,你應該放棄最後一個函數的最後一個,並且用'#'identity'代替'#'not'。此外,Common Lisp使用'(defun function(args)...)'而'(define(function args)...)'是scheme。 – 2013-03-10 14:11:01

相關問題