2010-07-20 87 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