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

时间:2011-11-01 03:02:13

标签: recursion functional-programming lua counter

我正在尝试跟踪合并排序中的数组元素之间的比较次数。该程序是用Lua编写的。我试图使用多个结果并跟踪计数器,但它没有成功。还有其他建议吗?

这是我的第一篇文章,如果它很乱,那就很抱歉。谢谢!

function merge_sort (src_array)

  if #src_array <= 1 then 
    return src_array 
  else
   local a1, a2 = split_array(src_array)        -- splitting array to sort
   return merge(            -- merge the results recursively
         merge_sort(a1),    
         merge_sort(a2))
   end
end 

2 个答案:

答案 0 :(得分:4)

  

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

如果您想使用多个结果执行此操作,则需要更改递归调用。 每个函数都应该返回一个已排序的数组以及对其进行排序所需的比较次数:

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   -- number of comparisons

  local function merge(a1, a2)
    -- merge a1 and a2, incrementing n at each comparison
    -- return merged array
  end
  local function sort(a)
    if #a <= 1 then 
      return a
    else
      local a1, a2 = split_array(a)        -- splitting array to sort
      return merge(            -- merge the results recursively
            sort(a1),    
            sort(a2)) -- recursive call to `sort` *not* `merge_sort`
    end
  end
  local sorted = sort(src_array)
  return sorted, n
end 

答案 1 :(得分:3)

使用upvalue(以下示例中的i):

do
    local i = 0
    function foo ()
        if i>= 100 then return i end
        i = i + 1
        return foo()+foo()
    end
end