2012-06-21 3 views
2

Dans Lua, j'ai une structure de la relation entre les objets arbre où un objet peut avoir plusieurs enfants, mais un seul objet parent, à savoirrecherche récursive avec des objets Lua

obj --- --- obj1 obj2 --- objd3 --- obj4 --- obj5 --- obj6

Si je veux connaître les parents «éloignés» de obj6 au lieu de simplement le parent immédiat obj5, comment puis-je y parvenir? J'ai juste besoin d'une liste de parents de deux niveaux ou plus au-dessus de l'objet actuel, et l'API avec laquelle je travaille a seulement une propriété obj.parent.

pseudo-code serait également utile de me faire dans la bonne direction.

+1

Qu'avez-vous essayé? Vous semblez savoir que vous devez faire une recherche récursive, alors faites-le. –

Répondre

2

Eh bien, si votre api prend en charge .parent, ne pouvez-vous faire quelque chose comme ce qui suit? Je suis rouillé avec Lua mais ça devrait être un début.

local function GetAncestors(child) 

    local ancestors = {}; 

    if child.parent then 
     local i = 0; 
     ancestors[0] = child.parent; 
     while ancestors[i].parent do 
      ancestors[i + 1] = ancestors[i].parent; 
      i = i + 1; 
     end 
    end 

    return ancestors; 

end 
+0

Merci beaucoup c'était exactement ce que j'essayais de faire. :) – aethys

+0

Btw, cela devrait vous obtenir la «liste des parents» demandé à partir de laquelle vous pouvez ensuite exclure les générations que vous souhaitez. Comme je l'ai dit, si j'ai un problème de logique/syntaxe, faites le moi savoir. – canon

+0

Down-vote sans un commentaire est de mauvais goût imo. – canon

3
obj.parent    -- immediate parent (obj5) 
obj.parent.parent  -- parent's parent (obj4) 
obj.parent.parent.parent -- parent's parent's parent (obj3) 

ainsi de suite?

Si vous voulez éviter d'essayer de référencer un parent non existant, je suppose que vous pourriez faire quelque chose comme:

function getAncestor(obj, depth) 
    if not obj.parent then 
     return nil 
    elseif depth > 1 then 
     return getAncestor(obj.parent, depth-1) 
    end 
    return obj.parent 
end 


-- get parent 
obj = getAncestor(obj6) 

-- get great great grandparent 
obj = getAncestor(obj6, 3)