Lisp 如何检索每个“中的最小值列表”;栏「;从一个列表中?

Lisp 如何检索每个“中的最小值列表”;栏「;从一个列表中?,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,我有一个小函数,它返回一组3个列表中的最小值,有没有一种方法可以让它看起来更好?这对我来说似乎不是很口齿不清,但我可能也不知道这意味着什么(我是一个口齿不清的人) 任何提示都将不胜感激 ;;;;minimum of 3 (defun minimum-of-3 (list1 list2 list3);returns the minimum value when comparing 3 lists (setq minimum-list '()) (setq mini '())

我有一个小函数,它返回一组3个列表中的最小值,有没有一种方法可以让它看起来更好?这对我来说似乎不是很口齿不清,但我可能也不知道这意味着什么(我是一个口齿不清的人) 任何提示都将不胜感激

;;;;minimum of 3

(defun minimum-of-3 (list1 list2 list3);returns the minimum value when comparing 3 lists
    (setq minimum-list '())
    (setq mini '())
    (loop for x in list1
            for y in list2
            for z in list3
            do
            (push x mini)
            (push y mini)
            (push z mini)
            (push (apply 'min mini) minimum-list)
            (setq mini '()))

    (reverse minimum-list))

如果您已经在使用
loop
了,您不需要其他任何东西,请阅读有关
loop
的内容,它非常强大

(defun minimum-of-3 (list-1 list-2 list-3)
  (loop :for x :in list-1
        :and y :in list-2
        :and z :in list-3
        :collect (min x y z)))

CL-USER> (minimum-of-3 '(1 2 3) '(4 5 6) '(7 8 -1))
(1 2 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8 -1))
(1 -5 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8))
(1 -5)

如果您已经在使用
loop
了,您不需要其他任何东西,请阅读有关
loop
的内容,它非常强大

(defun minimum-of-3 (list-1 list-2 list-3)
  (loop :for x :in list-1
        :and y :in list-2
        :and z :in list-3
        :collect (min x y z)))

CL-USER> (minimum-of-3 '(1 2 3) '(4 5 6) '(7 8 -1))
(1 2 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8 -1))
(1 -5 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8))
(1 -5)

如果您真的想使用循环,coredump的答案很好,但这里没有必要这样做mapcar可以接受多个列表参数,而min可以接受一个或多个参数,因此您可以对列表执行mapcarmin

(let ((xs '(8 4 1))
      (ys '(3 9 2))
      (zs '(9 2 4)))
  (mapcar 'min xs ys zs))
;=> (3 2 1)

如果您真的想使用循环,coredump的答案很好,但这里没有必要这样做mapcar可以接受多个列表参数,而min可以接受一个或多个参数,因此您可以对列表执行mapcarmin

(let ((xs '(8 4 1))
      (ys '(3 9 2))
      (zs '(9 2 4)))
  (mapcar 'min xs ys zs))
;=> (3 2 1)

首先,你可以删除setq并将其包装到let中,如果一个列表比anores短,sepose函数会做什么?它只是结束,它是3个相同长度列表的比较,我是noob。我会把它包起来,看看它是什么样子。谢谢。@coredump每次看到你的评论我都很困惑;-)(是我写的吗?)首先,你可以删除setq并将其包装到let中,如果一个列表比anores短,sepose函数会做什么?它只是结束,它是3个相同长度列表的比较,我是noob。我会把它包起来,看看它是什么样子。谢谢。@coredump每次看到你的评论我都很困惑;-)(这是我写的吗?)编辑写道,我只是觉得试图解决同一问题的人有更好的机会找到它。哈哈,我的编辑是对的(一)。即使你拒绝了它。@id256在最小需要多少参数上绝对正确。很多数学运算符都可以接受0个参数,返回标识元素而不返回任何参数(例如,(+)=0),这很好。我想我点击拒绝按钮是因为一些语法问题,而不是因为技术问题。谢谢你抓住它!在编辑时,我只是想,试图解决同一问题的人会有更好的机会找到它。哈哈,我的编辑是对的。即使你拒绝了它。@id256在最小需要多少参数上绝对正确。很多数学运算符都可以接受0个参数,返回标识元素而不返回任何参数(例如,(+)=0),这很好。我想我点击拒绝按钮是因为一些语法问题,而不是因为技术问题。谢谢你抓住它!我只是略过了“Lisp之地”的高级循环部分,我现在在前面的章节,我也有“实用的普通LISP”的Peter Seibel,我将阅读这两个,谢谢你的头:)@ Floofk是CL是你的第一个编程语言一般考虑温和介绍普通LISP:谢谢你的建议,我会尽快买的!(编辑:刚在网上找到,我会看看我是怎么处理的,但在电脑屏幕上看书对我来说从来没有真正起过作用)我只浏览了“Lisp之地”的高级循环部分,我目前在前一章中,我还有Peter Seibel的“实用通用Lisp”,我将阅读这两个部分,谢谢你的提示:)Floofk是CL是你的第一个编程语言,一般来说,考虑一下普通LISP的介绍:谢谢你的推荐,我会尽快购买的!(编辑:刚在网上找到,我会看看我是怎么处理的,但是在我的电脑屏幕上看书对我来说从来没有真正起过作用)