我如何在多个递归调用中维护一个单一计数器?

我正在尝试追踪归并排序中数组元素之间的比较次数。该程序是用 Lua 编写的。我尝试使用多个结果并跟踪计数器,但结果并不理想。是否有其他建议?

这是我的第一篇帖子,如果有错漏请见谅。谢谢!

原文链接 https://stackoverflow.com/questions/7962018

点赞
stackoverflow用户282536
stackoverflow用户282536

使用一个upvalue(在下面的例子中为i):

do
    local i = 0
    function foo ()
        if i>= 100 then return i end
        i = i + 1
        return foo()+foo()
    end
end
2011-11-01 03:06:57
stackoverflow用户41661
stackoverflow用户41661

我正在尝试使用多个结果并跟踪计数器

如果要使用多个结果,您需要更改递归调用。每个函数应返回一个排序后的数组和排序所需的比较次数:

local s1, n1 = merge_sort(a1)
local s2, n2 = merge_sort(a2)
local s, n = merge(s1, s2)
return s, n1 + n2 + n

您的基础情况将如下所示

return src_array,0

我认为可能不值得使用额外的结果,您最好使用本地计数器和嵌套的merge函数:

function merge_sort(src_array)

  local n = 0  - 比较次数

  local function merge(a1,a2)
    - 合并a1和a2,在每个比较时增加n
    - 返回合并的数组
  end
  local function sort(a)
    if # a <= 1 then
      返回
    else
      local a1,a2 = split_array(a) - 拆分要排序的数组
      return merge(-递归合并结果
            sort(a1),
            sort(a2))- *不是* `merge_sort`的递归调用
    end
  end
  local sorted = sort(src_array)
  return sorted,n
end
2011-11-01 03:43:47