Lisp 为什么将“(null x)”替换为“(null(cdr x))”会使代码正常工作?
我是口齿不清的新手。我正在尝试用LISP编写一个冒泡排序函数 这就是我到目前为止所做的Lisp 为什么将“(null x)”替换为“(null(cdr x))”会使代码正常工作?,lisp,common-lisp,Lisp,Common Lisp,我是口齿不清的新手。我正在尝试用LISP编写一个冒泡排序函数 这就是我到目前为止所做的 (defun mysort (x) (if (null x) x (if (< (car x) (cadr x)) (cons (car x) (mysort (cdr l))) (cons (cadr x) (mysort (cons (car x) (cddr x))))))) 当我在参考了几个代码之后修改代码时- (defun mysort (x) (if
(defun mysort (x)
(if (null x) x
(if (< (car x) (cadr x))
(cons (car x) (mysort (cdr l)))
(cons (cadr x) (mysort (cons (car x) (cddr x)))))))
当我在参考了几个代码之后修改代码时-
(defun mysort (x)
(if (null (cdr x)) x
(if (< (car x) (cadr x))
(cons (car x) (mysort (cdr l)))
(cons (cadr x) (mysort (cons (car x) (cddr x)))))))
现在它工作得很好
为什么要更换
如果为空x x。。。
具有
如果为空cdr x x。。。
有什么不同
另外,我从另一个函数调用mysort来运行它的长度x次数。是否可以仅使用基本函数在单个递归循环中实现完整排序?如果要查看第一个元素是否小于第二个元素,则列表至少需要有两个元素 如果只有一个元素,CADR将返回NIL。这不是一个数字
CL-USER 18 > (cadr '(1))
NIL
您的Lisp系统不仅应该告诉您错误,还应该告诉您发生错误的函数。这里:函数如果要查看第一个元素是否小于第二个元素,那么列表至少需要有两个元素 如果只有一个元素,CADR将返回NIL。这不是一个数字
CL-USER 18 > (cadr '(1))
NIL
您的Lisp系统不仅应该告诉您错误,还应该告诉您发生错误的函数。这里:函数要进行比较,您至少需要两个元素,因此检查x是否为NIL是不够的 检查cdrx是否为NIL是检查列表长度是否至少为2的好方法,因为NIL是特殊的,即使它不是cons单元格,也可以保证cdr NIL为NIL
您得到的错误是因为NIL不是一个数字,因此您无法与进行比较。要进行比较,您至少需要两个元素,因此检查x是否为NIL是不够的 检查cdrx是否为NIL是检查列表长度是否至少为2的好方法,因为NIL是特殊的,即使它不是cons单元格,也可以保证cdr NIL为NIL
您得到的错误是因为NIL不是一个数字,因此您无法在工作/失败的情况下与cdr x进行比较?这与使用/返回的x有什么关系?想象一下,当x是‘a/cons’时,是‘nil’对‘nil’,哦,现在明白了。感谢您的帮助。工作/失败案例中的cdr x是什么?这与使用/返回的x有什么关系?想象一下,当x是‘a/cons’时,是‘nil’对‘nil’,哦,现在明白了。谢谢你的帮助。
(defun mysort (x)
(if x
(let ((minimum (reduce #'min x)))
(cons minimum
(mysort (remove minimum x :count 1))))))