List 如何在lisp中按升序排列3个数字
我试图在lisp中按升序排列3个数字。 但我在编译和加载时遇到了类似“if的参数数量不正确”的错误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
(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))
首先,我们假设这三个参数已经处于正确的顺序,如果这不是真的,我们通过使用交换两个变量或旋转三个或更多变量的原始函数来更改它们 必要时,第一个(取消订单(最小-中-最大) (当(<分钟中) (每分钟中段) (如果(
有什么作用?我认为progn是为了不产生功能,但我不确定……因为代码没有以任何有用的方式缩进/格式化,所以被否决了。这是不可读的。请正确设置代码格式,并删除多余的修正
和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
s。查看progn
的功能。欢迎访问。如果您提供了一个答案,这是很有用的,但是,您确实需要在答案中添加更多有用的细节。你还冒着回答被否决的风险,没有提供额外的支持细节。progn
- 首先,如果它小于