1

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

2 回答 2

3

尽管我已经编写了代码,但我不会给你代码。不过,我会告诉你你做错了什么:

  • 检查线路(if null l)。你缺少一个父母。
  • 你确定and是你想要的比较器吗?
  • 您正在has_list_p递归调用,这是正确的,但您想在列表的其余部分调用它——除了第一个元素。你怎么能得到它?

祝你好运,编码愉快!

于 2013-10-28T23:51:10.707 回答
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)))))

在我定义了这个过程之后,在 common lisp 中,它打印了:

[2]> (has-list-p '(1 2))
NIL
[3]> (has-list-p '(1 2 '(3 4)))
T

在 Emacs Lisp 中也是如此。

于 2013-10-28T23:59:12.973 回答