lisp - 为什么将 "(null x)"替换为 "(null (cdr x))"会使此代码有效?

标签 lisp common-lisp

我是 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/

相关文章:

list - 有关如何处理此 lisp 函数的建议。

list - 如何在递归置换函数中一个一个地返回置换列表元素?

lisp - "What number am I thinking of"Scheme中的猜谜游戏

Lisp 重新定义函数

common-lisp - Common Lisp 中的重置状态

linux - 如何检查 Xorg 是否在 emacs lisp 中运行?

macros - Lisp:将 &rest 参数传递给宏

common-lisp - make-instance 占用 524k 字节,耗时 4 毫秒

arrays - Lisp 格式过程应用于数组

macros - 完全展开一个宏窗体