Common lisp 如何检查列表中的所有元素是否相等?

Common lisp 如何检查列表中的所有元素是否相等?,common-lisp,Common Lisp,这是我到目前为止得到的,但它只是比较第一个元素和第二个元素。所以,如果我计算这个?(检查“(a))它应该返回true,但是如果我计算?(检查“(a))它应该返回Nil (defun check (lista) (cond ((null lista)'()) ((equal (car lista)(cadr lista))cdr lista) (t(check (cdr lista))))) 我不确定这是否是最惯用的方式,但我会从这样的方式开始 CL-USER> (let* ((list

这是我到目前为止得到的,但它只是比较第一个元素和第二个元素。所以,如果我计算这个?(检查“(a))它应该返回true,但是如果我计算?(检查“(a))它应该返回Nil

(defun check (lista)
(cond
((null lista)'())
((equal (car lista)(cadr lista))cdr lista)
(t(check (cdr lista)))))

我不确定这是否是最惯用的方式,但我会从这样的方式开始

CL-USER> (let* ((list '(a a a a))
                (first-element (first list)))
           (every (lambda (x) (equal x first-element)) list))
T
CL-USER> (let* ((list '(a a a b))
                (first-element (first list)))
           (every (lambda (x) (equal x first-element)) list))
NIL

我不确定这是否是最惯用的方式,但我会从这样的方式开始

CL-USER> (let* ((list '(a a a a))
                (first-element (first list)))
           (every (lambda (x) (equal x first-element)) list))
T
CL-USER> (let* ((list '(a a a b))
                (first-element (first list)))
           (every (lambda (x) (equal x first-element)) list))
NIL
一些评论:

  • 缩进代码以提高可读性
  • 检查列表只有一个元素的情况
  • 当第一个和第二个元素不同时,可以递归调用函数,但在这种情况下,您不需要它,因为已经知道该属性为false
您的尝试几乎是好的,您只是将递归调用放在了错误的位置。相等是可传递的,因此您只需将每个元素与其后继元素进行比较,并查看该属性是否适用于子列表。我个人会这样写:

(defun all-equal-p (list)
  (or (null (rest list)) ;; singleton/empty
      (and (equalp (first list)
                   (second list))
           (all-equal-p (rest list)))))
一些评论:

  • 缩进代码以提高可读性
  • 检查列表只有一个元素的情况
  • 当第一个和第二个元素不同时,可以递归调用函数,但在这种情况下,您不需要它,因为已经知道该属性为false
您的尝试几乎是好的,您只是将递归调用放在了错误的位置。相等是可传递的,因此您只需将每个元素与其后继元素进行比较,并查看该属性是否适用于子列表。我个人会这样写:

(defun all-equal-p (list)
  (or (null (rest list)) ;; singleton/empty
      (and (equalp (first list)
                   (second list))
           (all-equal-p (rest list)))))

撇开练习不谈,最简洁的检查形式是

(every #'eql list (rest list))

each
获取一个函数并将其应用于以下每个序列的一个元素,该序列可以是该函数接受的任何数字。因此,这个调用会比较每两个连续的元素。

除了练习之外,最简洁的检查形式是

(every #'eql list (rest list))

each
获取一个函数并将其应用于以下每个序列的一个元素,该序列可以是该函数接受的任何数字。因此,此调用将比较每两个连续元素。

请检查缩进和代码语法。在第二个
cond
中,我猜缺少一对括号。缺少的括号在cdr列表a中,添加括号将请求cdr列表a是一个lambda表达式。请检查缩进和代码的语法。在第二个
cond
中,我猜缺少一对括号。缺少的括号在cdr lista中,添加括号将请求cdr lista成为lambda表达式。感谢您的回答,当我开始使用lambda表达式时,我将使用此作为参考,我真的不理解lambda表达式。谢谢你的回答,当我开始使用lambda表达式时,我会用它作为参考,我还真的不理解lambda表达式