我想检查LISP中的列表是否包含列表或递归。如何修复此代码?
(defun has-list-p(l)
(if null l)
nil
(and (listp(car l)) (has-list-p(l))))
谢谢大家!我编码的解决方案是:
(defun has-list-p(l)
(if (null l)
nil
(or (listp(car l)) (has-list-p(cdr l)))))
答案 0 :(得分:3)
虽然我写了代码,但我不打算给你代码。不过,我会告诉你你做错了什么:
(if null l)
行。你错过了一个paren。and
是您想要的比较器吗?has_list_p
,这是正确的,但你想在列表的 rest 上调用它 - 除了第一个元素之外的所有内容。你怎么能得到它?祝你好运,编码愉快!
答案 1 :(得分:1)
(defun has-list-p(l)
;nothing more to check - return nil - no inner lists
(if (null l)
nil
;the first element of the list is a list?
(if (listp (car l))
;if yes - return true
t
;otherwise - try for the cdr of the list
(has-list-p (cdr l)))))
在我定义此程序后的常见lisp中,它打印出来:
[2]> (has-list-p '(1 2))
NIL
[3]> (has-list-p '(1 2 '(3 4)))
T
在Emacs Lisp中也是如此。