Lisp 获取包含三个数字的列表的最大值

Lisp 获取包含三个数字的列表的最大值,lisp,common-lisp,lispworks,Lisp,Common Lisp,Lispworks,我现在正在学习Lisp,我正在做一个练习,要求我获得列表的最大值,语法与我所学的大多数编程语言完全不同,所以我遇到了一些困难 我的代码: (defun test(y) (cond ((and (first y) (> (second y)) (> (third y))) (format t "numero maximo ~d" (first y)) ((and (second y) (> (first y))

我现在正在学习Lisp,我正在做一个练习,要求我获得列表的最大值,语法与我所学的大多数编程语言完全不同,所以我遇到了一些困难

我的代码:

 (defun test(y)
     (cond
          ((and (first y) (> (second y)) (> (third y))) 
        (format t "numero maximo ~d" (first y))
          ((and (second y) (> (first y)) (> (third y))) 
        (t (format t "numero maximo ~d" (second y))
          ((and (third y) (> (second y)) (> (first y))) 
        (t (format t "numero maximo ~d" (third y))
    ))

我收到此错误:
区域中的s表达式不完整

您的代码太复杂,它试图从列表中获取元素,比较它们,然后打印一些内容。与其他语言一样,使用较小的函数,尤其是在使用新语言时,经常进行测试,以避免调试过大的内容

使用Emacs自动缩进的代码如下所示:

(defun test(y)
  (cond
    ((and (first y) (> (second y)) (> (third y)))
     (format t "numero maximo ~d" (first y))
     ((and (second y) (> (first y)) (> (third y)))
      (t (format t "numero maximo ~d" (second y))
         ((and (third y) (> (second y)) (> (first y)))
          (t (format t "numero maximo ~d" (third y))
             ))
编辑抱怨括号不平衡:

  • (>(第二个y))
    中,
    函数只给出一个参数
  • 所有的
    cond
    子句实际上都嵌套在第一个子句中。在这里,使用突出显示匹配括号的编辑器有很大帮助。语法应为:

    (cond
      (test-1 ...)
      (test-2 ...)
      (t ...))
    
    如果您的测试涉及调用谓词,那么它看起来像:

    (cond
      ((and (f1 ...) (f2 ...)) ;; <-- test
       ... ;; <-- code
      ) ;; end of first clause
    ) ;; end of cond
    
    评估功能,并在多个输入上进行测试,例如在REPL中:

    CL-USER> (max-of-3 0 2 1)
    2
    ....
    
    然后,您可以为您的列表构建另一个函数:

    (defun test (list)
       (format t 
               "numero maximo ~d"
               (max-of-3 (first list)
                         (second list)
                         (third list))))
    

    如果您需要提前进行更多的错误检查,比如检查列表的格式是否正确,您可能应该定义其他辅助功能。

    如果我理解了问题和答案,我可能能够提供一个或两个返回最大值的解决方案,而不管列表的长度如何。因此,这些解决方案并不局限于三种

    这说明了一种测试方法,其中“max lst”是正在测试的Lisp函数:

    (defconstant test-case 
      (list 1 2 0 8 7 6 9 4 5))
    
    (defun run-test ()
      (max-lst test-case))
    
    解决方案1 此解决方案使用递归。如果您更喜欢循环,Lisp有几个循环。未使用Lisp函数“max”:

    (defun max-lst (lst-in)
      (cond ((null (second lst-in))
             (first lst-in))
    
            ((> (first lst-in) (second lst-in))
             (max-lst
              (list* (first lst-in) (rest (rest lst-in)))))
    
            (t
             (max-lst
              (list* (rest lst-in))))))
             
    
    解决方案2 如果您不反对使用Lisp函数“max”,这里有一个使用max的解决方案

    请注意,max不限于两个参数

    (max 5 6 4 7 3)
    
    我7点回来

    在此解决方案中,函数“max”作为参数传递给函数“reduce”。“reduce”函数将函数和列表作为参数。该函数应用于每个相邻的参数对并返回结果。如果需要求和,可以传递+参数

    (defun max-lst-using-max (lst-in)
      (reduce #'max lst-in)) 
    

    唉,我担心我提供这些解决方案太晚了,与原始海报不相关。但也许其他人也会有类似的问题。所以,也许这终究会有所帮助

    (defun max-lst-using-max (lst-in)
      (reduce #'max lst-in))