确定列表是否包含列表

时间:2013-10-28 23:43:08

标签: lisp

我想检查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)))))

2 个答案:

答案 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中也是如此。