Common lisp 如何检查列表中的所有元素是否相等?
这是我到目前为止得到的,但它只是比较第一个元素和第二个元素。所以,如果我计算这个?(检查“(a))它应该返回true,但是如果我计算?(检查“(a))它应该返回NilCommon 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
(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表达式