我是 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)))))))
我遇到了一个错误
NIL is not a real number
当我修改代码时(在引用了几个代码之后)-
(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)))))))
现在它工作正常。
为什么要替换 (如果(null x)x ...) 和 (if (null (cdr x)) x...) 有所作为?
此外,我从另一个函数调用 mysort 以运行它(长度 x)次。仅使用基本函数,是否可以在单个递归循环中实现完整排序?
最佳答案
如果要查看第一个元素是否小于第二个元素,那么列表至少需要有两个元素。
如果只有一个元素,CADR
返回 NIL
.这不是数字。
CL-USER 18 > (cadr '(1))
NIL
您的 Lisp 系统不仅应该告诉您错误,还应该告诉您发生错误的函数。这里:函数 <
.
使用 (null (cdr list))
是测试是否有第二个元素的好方法。一个典型的错误是调用 LENGTH
, 这是低效的。
关于lisp - 为什么将 "(null x)"替换为 "(null (cdr x))"会使此代码有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23075766/