【发布时间】:2016-06-23 09:40:32
【问题描述】:
这就是我在 lisp 中运行合并排序程序时发生的情况。
(MSORT'(1 2 3 4 5 6 7 8 9))
“堆栈溢出(深)”。
我很确定我经常将我的函数添加到列表中,但我不知道如何修复它。
(defun fhl(l)
(progn
(setf msize (mod (length l) 2));; mod for size even check
(setf size (- (/ (length l) 2) 1));;size of list -1 because we start on pos 1 in list
(setf f (list (car l)));;size of list -1 because we start on pos 1 in list
(if (eq msize 1) (setf size (+(floor size)1)));;if mod = 1 list is odd - .5 to round to whole number + 1 for more even spread
(dotimes (i size)
(setf f (append f (list (nth (+ i 1) l)))));; add next element in list size times
f));;return new list
(defun shl(l)
(progn
(setf msize (mod (length l) 2));; mod for size even check
(setf size (/ (length l) 2));;size of list -1 because we start on pos 1 in list
(if (eq msize 1) (setf size (+(floor size) 1)));;if mod = 1 list is odd - .5 to round to whole number + 1 for more even spread
(dotimes (i size) ;; loop for i items
(setf l (cdr l)))
l))
(defun msort(l)
(if (null l)
'();;empty list
)
(if (= (length l) 1) l);;1 item
(progn
(setf f (fhl l))
(setf s (shl l))
(merge 'list (msort f) (msort s) #'<)
)
)
【问题讨论】:
-
一些风格的 cmets 来改进你的代码。使用 let 而不是 progn 与 setf。 msort 中的第一个 if 语句实际上什么都不做。尝试在 shl 中使用 nthcdr 而不是 dotimes & setf/cdr。
-
您是否使用过跟踪来查看您的函数被调用的频率以及使用哪些参数?
-
您需要绑定变量,而不仅仅是分配给它们,这是未定义的行为,并且在任何递归函数中几乎肯定是灾难性的错误。不幸的是,Python 及其同类已经导致绑定和赋值在人们的脑海中变得混乱。
-
空列表的
if不会取消递归。
标签: algorithm sorting recursion lisp mergesort