【发布时间】:2012-12-02 01:36:49
【问题描述】:
我是一名 Tcl 新手,为了学习,我正在尝试实现来自 Wikipedia 的归并排序算法伪代码:
function merge_sort(list m)
// if list size is 1, consider it sorted and return it
if length(m) <= 1
return m
// else list size is > 1, so split the list into two sublists
var list left, right
var integer middle = length(m) / 2
for each x in m before middle
add x to left
for each x in m after or equal middle
add x to right
// recursively call merge_sort() to further split each sublist
// until sublist size is 1
left = merge_sort(left)
right = merge_sort(right)
// merge the sublists returned from prior calls to merge_sort()
// and return the resulting merged sublist
return merge(left, right)
在我的 Tcl 脚本中我这样做:
proc merge_sort { lst } {
if { [llength $lst] <= 1 } {
return $lst
}
set middle [expr {[llength $lst] / 2}]
set left [lrange $lst 0 $middle]
set right [lrange $lst [expr {$middle + 1}] [llength $lst]]
set left [merge_sort $left]
set right [merge_sort $right]
return [merge $left $right]
}
根据我的调试尝试,一切正常,直到递归调用 merge_sort proc。
输出显示我“堆栈空间不足(无限循环?)”。老实说,我没有在代码中看到问题。我哪里错了?
【问题讨论】:
-
根据这篇文章astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/lrange.n.html。命令 lrange 获取列表、第一个和最后一个元素。当列表的长度 == 2 时,中间 = 1,所以左边包含第 0 个元素和第 1 个元素,右边包含 0 个元素。所以你得到了无限递归。调试你的代码