Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在lisp中按升序排列3个数字_List_Function_Lisp - Fatal编程技术网

List 如何在lisp中按升序排列3个数字

List 如何在lisp中按升序排列3个数字,list,function,lisp,List,Function,Lisp,我试图在lisp中按升序排列3个数字。 但我在编译和加载时遇到了类似“if的参数数量不正确”的错误 (defun order (n1 n2 n3) (if (>= n1 n2) (progn(progn(if (>= n1 n3) (progn(if (>= n2 n3) (progn(setf max n1) (setf mid n2) (setf min n3)) (progn(setf max n1) (setf

我试图在lisp中按升序排列3个数字。 但我在编译和加载时遇到了类似“if的参数数量不正确”的错误

(defun order (n1 n2 n3)
     (if (>= n1 n2)
        (progn(progn(if (>= n1 n3) 
            (progn(if (>= n2 n3) (progn(setf max n1) (setf mid n2) (setf min n3))     (progn(setf max n1) (setf mid n3) (setf min n2))))
        (progn(setf max n3) (setf mid n1) (setf min n2))
        )))
         (progn(progn(if (< n1 n3) 
             (progn(if (>= n2 n3) (progn(setf max n2) (setf mid n3) (setf min n1))     (progn(setf max n3) (setf mid n2) (setf min n1))))
        ((setf max n2) (setf mid n1) (setf min n3))
        )))

    ))
    (list min mid max)
)
(取消订单(n1 n2 n3)
(如果(>=n1 n2)
(progn(progn)(如果(>=n1 n3)
(程序(如果(>=n2 n3)(程序(setf max n1)(setf mid n2)(setf min n3))(程序(setf max n1)(setf mid n3)(setf min n2)))
(程序(设定值最大n3)(设定值中间n1)(设定值最小n2))
)))
(progn(progn)(如果=n2 n3)(程序(设置最大n2)(设置中间n3)(设置最小n1))(程序(设置最大n3)(设置中间n2)(设置最小n1)))
((设定值最大n2)(设定值中间n1)(设定值最小n3))
)))
))
(列出最小中最大值)
)

一个好方法是用英语写下你需要实现的三位数排序算法,而不是随机键入并希望它能起作用。然后,如果幸运的话,可以直接将其转换为代码

所以

订购a、b、c:


  • 如果a这里有一个可能的解决方案:

    (defun order (min mid max)
      (when (< mid min)
        (rotatef mid min))
      (if (< max min)
          (rotatef max mid min)
          (when (< max mid)
            (rotatef mid max)))
      (list min mid max))
    
    (取消订单(最小-中-最大)
    (当(<分钟中)
    (每分钟中段)
    (如果(
    首先,我们假设这三个参数已经处于正确的顺序,如果这不是真的,我们通过使用交换两个变量或旋转三个或更多变量的原始函数来更改它们

    必要时,第一个
    修正
    min
    mid
    之间的相对顺序,如果
    mid
    小于
    min
    ,则交换它们

    当我们知道
    min
    实际上小于
    mid
    时,我们尝试以这种方式将
    max
    放在正确的位置:

    • 首先,如果它小于
      min
      ,这意味着它是三个变量中较小的一个,我们适当地旋转这三个变量

    • 否则,它可能介于
      min
      mid
      之间,在这种情况下,我们交换
      mid
      max
      变量。如果大于或等于
      mid
      ,则不必进行交换,且三个变量已按正确顺序包含值

    气泡排序格式副本:

    (defun order (a b c)
          (when (> a b) (rotatef a b))
          (when (> b c) (rotatef b c))
          (when (> a b) (rotatef a b)) 
          (list a b c))
    

    真正的好奇:你认为progn
    有什么作用?我认为progn是为了不产生功能,但我不确定……因为代码没有以任何有用的方式缩进/格式化,所以被否决了。这是不可读的。请正确设置代码格式,并删除多余的
    progn
    s。查看
    progn
    的功能。欢迎访问。如果您提供了一个答案,这是很有用的,但是,您确实需要在答案中添加更多有用的细节。你还冒着回答被否决的风险,没有提供额外的支持细节。