2014-05-05 99 views
0

我有一個多級樹形結構,我試圖返回一個可以有1-3個祖先的對象的祖先數組。我有一個工作方法,但它很複雜,我寧願使用循環,任何人都知道我可以如何使用ruby?在多級樹形結構中循環遍歷父節點

def ancestors 
    @a = [] 
    @a.push(parent) if parent.present? 
    @a.push(@a.last.parent) if @a.last.parent.present? 
    @a.push(@a.last.parent) if @a.last.parent.present? 
    return @a 
end 
+1

認爲遞歸解決方案可能是最乾淨的 –

+0

您可以請證明我如何做到這一點的一個例子嗎? @KarthikT –

回答

2

假設我理解你的類的權利..我想是這樣的

def ancestors 
    (parent.present? ? [parent, parent.ancestors] :[]).flatten 
end 

如果父親存在,它將返回一個由父親及其祖先組成的數組。扁平化是必需的,因爲每個級別都添加一個數組層。

偏離主題。 return在ruby中被認爲是糟糕的風格,除非你需要,否則這個列表不需要是成員變量。

+0

有趣的解決方案,完美的作品,是乾的,謝謝! –

+0

@JeremyRichards :)很高興我能幫上忙 –

1

這是一個遞歸的工作。 你需要創建一個自己調用的函數。 事情是這樣的....

def ancestors 
    if self.parent.present? 
    ancestors << self.parent.ancestors 
    else 
    return self 
    end 
end 
+0

這正是我所需要的,我不斷收到'SystemStackError:堆棧層太深'。我不能讓它正常工作,你知道我可能會出錯嗎? –

+0

檢查您的退出條件。你必須找到解決方案。退出條件是任何遞歸解決方案中最重要的部分。 –

+0

錯誤是因爲'祖先'調用'祖先'本身 –

1

這是相當簡單的用一個迭代要做到這一點爲好,你可以嘗試

def ancestors 
    @a = [] 
    anc=parent 
    while anc.present? do 
    @a.push anc 
    anc=anc.parent 
    end 
    return @a 
end 

(沒試過,因爲我沒有你的數據結構)

+0

這個開箱即用!謝謝 –