Common lisp 公共Lisp合并排序分解

Common lisp 公共Lisp合并排序分解,common-lisp,mergesort,timsort,Common Lisp,Mergesort,Timsort,我向自己提出了挑战,要用CommonLisp来完成算法课上的所有作业。我进入了学习lisp的第一天,我遇到了一个障碍 赋值是创建一个合并排序,当达到任意子集长度(Timsort)时,该排序将转换为插入。插入部分工作得很好,但合并的拆分部分仅在程序必须拆分两次时才能工作。我知道这与lisp中列表的工作方式有关,我只是太新了,无法找出问题所在 我认为它要么击中一个无限循环。。。我不确定,因为当我用调试语句运行它时,当集合有太多元素时,它们永远不会被打印出来 我不是在这里乞求具体的答案或是有人来写我的

我向自己提出了挑战,要用CommonLisp来完成算法课上的所有作业。我进入了学习lisp的第一天,我遇到了一个障碍

赋值是创建一个合并排序,当达到任意子集长度(Timsort)时,该排序将转换为插入。插入部分工作得很好,但合并的拆分部分仅在程序必须拆分两次时才能工作。我知道这与lisp中列表的工作方式有关,我只是太新了,无法找出问题所在

我认为它要么击中一个无限循环。。。我不确定,因为当我用调试语句运行它时,当集合有太多元素时,它们永远不会被打印出来

我不是在这里乞求具体的答案或是有人来写我的代码。也许一个解释或者一个正确的方向会有很大帮助

我的代码:

;; Insertion sort method call (returns sorted list)
(defun insert-sort (lst) ... )

;; Merge sort method call
(defun merge-sort (lst)
  (print 'Merge)
  (print lst)
  (if (< (length lst) 7) ; Check to see if list is small enough to insert sort
      (insert-sort lst) ; Do so
      (progn ; else
        (setf b (merge-split lst)) ; Split the list, store into b
        (setf (car b) (merge-sort (car b))) ; Merge sort on first half
        ;; --- I think it's happening here ---
        (setf (cdr b) (merge-sort (cdr b))) ; Merge sort on second half
        (merge 'list (car b) (cdr b) #'<)))) ; Merge the two lists together (using API)

;; Split a list into two parts
(defun merge-split (lst)
   (progn
     (setf b lst) ; Set b to first index
     (setf a (cdr lst)) ; Set a to the rest of the list
     (loop while a do ; Loop while a != null
           (setf a (cdr a)) ; Make a equal next list node
           (if a ; If it still exists
               (progn
                 (setf a (cdr a)) ; Inc a again
                 (setf b (cdr b))))) ; Also inc b (b should always be half of a)
     (setf a (cdr b)) ; Set a to the list after b
     (setf (cdr b) NIL) ; Delete link after b
     (cons lst a))) ; Return in a cons
;;插入排序方法调用(返回排序列表)
(取消插入排序(lst)…)
;; 合并排序方法调用
(取消合并排序(lst)
(打印合并)
(打印lst)
(如果(<(长度lst)7);检查列表是否足够小以插入排序
(插入排序lst);执行此操作
(progn;else)
(setf b(merge-split-lst));拆分列表,存储到b中
(setf(车b)(合并排序(车b));上半部分合并排序
我想它正在这里发生---
(setf(cdrb)(合并排序(cdrb));下半部分合并排序

(合并列表(车辆b)(cdr b)#“您正被动态作用域变量所困扰。第一次调用SETF来设置a,b时,您隐式创建了全局的动态作用域变量。使用LET来声明它们。LET允许您包括要执行的表达式列表,就像PROGN一样,因此我的提示是,您可以通过将两个PROGN更改为LET来修复此问题。让我来告诉您知道你是否需要更多的东西来解开它。

一旦你让它工作起来,就把它交给样式反馈。啊!谢谢!我从来都不知道实例化变量的最合适的方法是什么。我会在这个问题上做更多的研究。再次感谢!它工作了!现在我知道了每个命令是如何初始化变量的了。比k你们这些家伙!