List 公共Lisp合并排序中的堆栈溢出

List 公共Lisp合并排序中的堆栈溢出,list,lisp,common-lisp,stack-overflow,mergesort,List,Lisp,Common Lisp,Stack Overflow,Mergesort,我已经编写了我的第一个通用Lisp函数,但我很难跟踪错误产生的位置。如何排除以下错误: 错误:值堆栈上的堆栈溢出。执行时:截断 这是我的密码: (defun mergelist (alist low mid high) (setq i1 low) (setq i2 (+ mid 1)) (setq i low) (setq blist `()) (loop while (and (<= i1 mid) (<= i2 high)) do

我已经编写了我的第一个通用Lisp函数,但我很难跟踪错误产生的位置。如何排除以下错误:

错误:值堆栈上的堆栈溢出。执行时:截断

这是我的密码:

(defun mergelist (alist low mid high)
    (setq i1 low)
    (setq i2 (+ mid 1))
    (setq i low)
    (setq blist `())
    (loop while (and (<= i1 mid) (<= i2 high)) do
        (if (<= (nth i1 alist) (nth i2 alist))
            (setf (nth (+ i 1) blist) (nth (+ i1 1) alist))
            (setf (nth (+ i 1) blist) (nth (+ i2 1) alist))
        )
    )
    (loop while (<= i1 mid) do
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist)) 
    )
    (loop while (<= i2 high) do
        (setf (nth (+ i 1) blist) (nth (+ i2 1) alist))  
    )
    (setq j low)
    (loop for j from j to high do
        (setf (nth i alist) (nth i blist))
    )
)

(defun mergesort (alist low high)
    (when (< low high)
        (mergesort alist low (/ (+ low high) 2))
        (mergesort alist (/ (+ low high) (+ 2 1)) high)
        (mergelist alist low (/ (+ low high) 2) high)
    )
)
我的预期回报是:


(123445)

我们可以做很多事情来改进这段代码

1。缩进

Lisp的语法相对较少,但我们使用缩进来帮助突出显示代码的结构。大多数支持Lisp的编辑器都可以帮助管理这一点。与传统的缩进方法最明显的不同是在下面几行上加上括号。我缩进了mergelist函数以显示更可读的函数体——至少对我来说是这样

(defun mergelist (alist low mid high) 
  (setq i1 low)
  (setq i2 (+ mid 1))
  (setq i low)
  (setq blist `())
  (loop while (and (<= i1 mid) (<= i2 high)) do
       (if (<= (nth i1 alist) (nth i2 alist))
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist))
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist))))
  (loop while (<= i1 mid) do
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist)))
  (loop while (<= i2 high) do
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist)))
  (setq j low)
  (loop for j from j to high do
       (setf (nth i alist) (nth i blist))))
(取消合并列表(低-中-高)
(setq i1低)
(setq i2(+mid 1))
(setq i低)
(setq blist`())

(loop while)和(我们可以做很多事情来改进这段代码

1.缩进

Lisp的语法相对较少,但我们使用缩进来帮助突出显示代码的结构。大多数支持Lisp的编辑器都有助于管理这一点。与传统缩进方法最明显的不同是在下面几行上加上括号。我缩进了mergelist函数,以显示更可读的函数体-至少是这样对我来说

(defun mergelist (alist low mid high) 
  (setq i1 low)
  (setq i2 (+ mid 1))
  (setq i low)
  (setq blist `())
  (loop while (and (<= i1 mid) (<= i2 high)) do
       (if (<= (nth i1 alist) (nth i2 alist))
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist))
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist))))
  (loop while (<= i1 mid) do
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist)))
  (loop while (<= i2 high) do
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist)))
  (setq j low)
  (loop for j from j to high do
       (setf (nth i alist) (nth i blist))))
(取消合并列表(低-中-高)
(setq i1低)
(setq i2(+mid 1))
(setq i低)
(setq blist`())

(循环while(and)(代码有太多错误:

  • 将列表视为向量:如果您想要随机访问的Lisp数据结构,请使用向量,而不是列表
  • 不声明变量
  • 而循环根本不起作用
  • 命令式,而不是功能性
  • 错误的代码布局

最好从头开始,避免上述错误。如果您想要Lisp列表,请使用不同的方式编写合并排序。提示:列表不像向量。它们可能会这样使用,但这样做通常是错误的。

代码有太多错误:

  • 将列表视为向量:如果您想要随机访问的Lisp数据结构,请使用向量,而不是列表
  • 不声明变量
  • 而循环根本不起作用
  • 命令式,而不是功能性
  • 错误的代码布局

最好从头开始,避免上述错误。如果您想要Lisp列表,那么请使用另一种方式编写合并排序。提示:列表不像向量。它们可能像向量一样使用,但这样做通常是错误的。

我建议读一本介绍Lisp的书。请参阅:您的代码不可修复。它是foobar。几乎每一个代码中的单行在Lisp中是错误的。它看起来像C,但在Lisp中不起作用。扔掉它。从头开始。尝试编写Lisp代码,而不是C代码。您的合并列表已经由Common Lisp as提供。我建议阅读一本介绍Lisp的书。请参阅:您的代码是不可修复的。它是foobar。您代码中的几乎每一行都是可修复的Lisp中的错误。它看起来像C,但在Lisp中不起作用。扔掉它。从头开始。尝试编写Lisp代码,而不是C代码。您的合并列表已经由Common Lisp as提供。很好的尝试…Common Lisp允许它。阅读Common Lisp。很好的尝试…Common Lisp允许它。阅读Common Lisp。谢谢,这非常有用。这是其中之一f我的尝试。我怀疑我会再次使用Common Lisp。只是尝试获取足够的基础知识来组合这个简单的排序。在查找Common Lisp的资源时遇到了困难。@defaultNINJA还值得指出的是,Common Lisp已经为您提供了合并列表。@defaultNINJA有关更多资源,请查看:@defaultNINJA,我真的希望你至少能继续这个小项目。到目前为止,你还没有接触过common lisp。下一步是清理循环。如果你被卡住了,请随时发布后续问题。谢谢,这非常有帮助。这是我的一次尝试。我怀疑我会再次使用common lisp。只是尝试获得e没有足够的基础知识来组合这个简单的排序。在为Common Lisp查找资源时遇到困难。@defaultNINJA还值得指出的是,您的合并列表已经由Common Lisp作为提供。@defaultNINJA有关更多资源,请查看:@defaultNINJA,我希望您至少继续这个小项目。您几乎没有接触过到目前为止,这是一个常见的lisp。下一步是清理循环。如果遇到问题,请随时发布后续问题。
(defun mergelist-2 (alist low mid high)
  (let ((i1 low)
    (i2 (+ mid 1)
      i (low)
      blist '()))

   (loop while (and (<= i1 mid) (<= i2 high)) do
       (if (<= (nth i1 alist) (nth i2 alist))
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist))
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist))))
  (loop while (<= i1 mid) do
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist)))
  (loop while (<= i2 high) do
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist)))
  (setq j low)
  (loop for j from j to high do
       (setf (nth i alist) (nth i blist))) ))
(defun mergelist-3 (alist low mid high)
  (let ((i1 low)
    (i2 (+ mid 1)
      i (low)
      j
      blist '()))

   (loop while (and (<= i1 mid) (<= i2 high)) do
       (if (<= (nth i1 alist) (nth i2 alist))
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist))
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist))))
  (loop while (<= i1 mid) do
       (setf (nth (+ i 1) blist) (nth (+ i1 1) alist)))
  (loop while (<= i2 high) do
       (setf (nth (+ i 1) blist) (nth (+ i2 1) alist)))
  (setq j low)
  (loop for j from j to high do
       (setf (nth i alist) (nth i blist)))
  *;return value here*
  ))