2010-07-20 6 views
2

Hey, j'essaye d'implémenter la fonction de fusion du tri de fusion dans Lua. Je connais assez bien l'algorithme, mais je suis nouveau à Lua. Je continue d'avoir un "mauvais argument # 1" pour "insérer" (table attendue, zéro) "Je crois que l'erreur pointe vers mon appel récursif. Je ne peux pas comprendre et j'ai l'impression que c'est quelque chose de plutôt trivial. J'ai juste besoin d'un Lua Guru pour me guider. Merci. Voici ma fonction:Fonction de fusion dans 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 

Répondre

6

Je ne suis pas tout à fait sûr de ce que vous voulez atteindre avec la fonction merge, mais un problème clair que table.insert ne retourne pas une table, elle retourne nil.

Stockage du résultat de la fusion dans le tableau t, en utilisant table.insert sur t et enfin retour t ne semble pas casser comme avant.

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 

Une note sur les quelques autres modifications que j'ai faites. table.remove renvoie l'élément supprimé, vous n'avez donc pas besoin d'accéder à l'élément, puis de le supprimer. Je recommande d'utiliser le mot-clé local pour les variables, car dans Lua toutes les variables sont globales par défaut.

+1

Salut. Merci pour les conseils! Ça a bien marché! La fonction de fusion prend deux tables déjà triées et les fusionne dans une table triée. J'ai dû changer le table.insert (t, tmp) à table.insert (t, 1, tmp) de sorte qu'il insère l'article au début de la table de retour. –

+0

Content d'être utile! – ponzao

+0

Mike K, je pense que vous avez oublié de marquer la réponse de ponzao comme correcte. – kikito