List 公共Lisp合并排序中的堆栈溢出
我已经编写了我的第一个通用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
错误:值堆栈上的堆栈溢出。执行时:截断
这是我的密码:
(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*
))