2010-07-20 64 views
2

嘿,我试图从合并排序在Lua中实现合并函数。我很熟悉算法,但我是Lua的新手。我不断收到一个“不好的论据#1','插入'(表预期,得到零)”我相信错误指向我的递归调用。我无法弄清楚,我有一种感觉,这是相当微不足道的。我只需要一个Lua大师给我一些指导。谢谢。这里是我的功能:Lua合并函数

function merge(l1, l2) 
if # l1 == 0 then 
    return l2 
elseif # l2 == 0 then 
    return l1 
else 
    if l1[1] <= l2[1] then 
     tmp = l1[1] 
     table.remove(l1,1) 
     return table.insert(merge(l1,l2),tmp) 

    else 
     tmp = l2[1] 
     table.remove(l2,1) 
     return table.insert(merge(l1,l2),tmp) 
    end 
end 
end 

回答

6

我不能完全确定要实现与merge功能是什么,但一个明确的问题是,table.insert不返回一个表,它返回nil

在表t中存储合并结果,table.insert使用t,最后返回t似乎没有像以前那样中断。

function merge(l1, l2) 
    if #l1 == 0 then 
     return l2 
    elseif # l2 == 0 then 
     return l1 
    else 
     if l1[1] <= l2[1] then 
      local tmp = table.remove(l1, 1) 
      local t = merge(l1, l2) 
      table.insert(t, tmp) 
      return t 
     else 
      local tmp = table.remove(l2, 1) 
      local t = merge(l1, l2) 
      table.insert(t, tmp) 
      return t 
     end 
    end 
end 

关于我做了几个其他修改的说明。 table.remove返回已移除的元素,因此您不必首先访问该元素,然后将其删除。我建议使用关键字local作为变量,因为在Lua中,默认情况下所有变量都是全局变量。

+1

嘿。感谢您的提示!它效果很好!合并函数采用两个已排序的表并将它们合并到一个已排序的表中。我必须将table.insert(t,tmp)更改为table.insert(t,1,tmp),以便它将项目插入到返回表的开头。 – 2010-07-20 19:46:17

+0

很高兴为您服务! – ponzao 2010-07-21 07:22:43

+0

Mike K,我想你忘记标记ponzao的答案是正确的。 – kikito 2010-07-26 15:43:24