检查列表是否包含至少一个非零元素

时间:2013-03-09 18:23:02

标签: lisp clisp

标题几乎可以说明一切。

我正在寻找像

这样的东西
(atleastonenonnil '(nil nil nil nil '(A B C)))
=> T

我可以以递归的方式做到,但我做不到。我应该使用一些内置功能吗? 我正在使用cLisp

3 个答案:

答案 0 :(得分: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 :(得分:1)

适合我。(AutoCAD' AutoLisp)示例:

(repeat 100000 (setq longlist (cons nil longlist)))

然后

(setq longlist (append longlist (list 1)))

这是一个100001元素列表,最后只有1个非nil元素。

(apply 'or longlist) 

返回T. Isn这是正确答案还是列表不够长?

答案 2 :(得分:-1)

怎么样:

(apply 'or '( your list here )) ;; ?