2012-04-03 65 views
0

通常我很喜歡這種類型的東西,但是這使我煩惱。我不得不在上個星期寫這個函數,並且遞歸地編寫它是最有意義的,儘管現在我試圖找到一種方法使它迭代到將其寫入我正在編寫的另一個函數中。這是函數的遞歸版本,如何使這個遞歸函數在python中迭代?

def XXX (x,y,z): 
    if z[x][0][0] != z[y][0][0]: 
     XXX(z[x][0],z[y][0],z) 
    else: 
     return z[x][0] 

,這是數據結構

{'A': [('AD', 4.0), None, None], 'C': [('ADBFGC', 14.5), None, None], 'B': [('BF', 0.5), None, None], 'E': [('ADBFGCE', 17.0), None, None], 'D': [('AD', 4.0), None, None], 'G': [('BFG', 6.25), None, None], 'F': [('BF', 0.5), None, None], 'ADBFG': [('ADBFGC', 6.25), ('AD', 4.25), ('BFG', 2.0)], 'BF': [('BFG', 5.75), ('B', 0.5), ('F', 0.5)], 'ADBFGC': [('ADBFGCE', 2.5), ('ADBFG', 6.25), ('C', 14.5)], 'ADBFGCE': [None, ('ADBFGC', 2.5), ('E', 17.0)], 'BFG': [('ADBFG', 2.0), ('BF', 5.75), ('G', 6.25)], 'AD': [('ADBFG', 4.25), ('A', 4.0), ('D', 4.0)]} 

我完全在這個空白,任何幫助,將不勝感激:)

+0

做這種遞歸(或迴路的情況下)總是結束?沒有太深入的分析,在我看來,創建一個會導致無限遞歸/循環的樹很簡單(條件檢查「樹已結束,沒有共同的祖先」) – ShinTakezou 2012-04-03 05:12:44

回答

1
def ClosestCommonAncestor(otu1, otu2, tree): 
    while tree[otu1][0][0] != tree[otu2][0][0]: 
     otu1,otu2,tree = tree[otu1][0],tree[otu2][0],tree 
    return tree[otu1][0] 

請注意,應該可以向遞歸版本添加功能。我還建議定義一個Tree(*children)課程以使事情更清楚。

+0

我感到很蠢,因爲沒有立即看到它..謝謝:) – TheFoxx 2012-04-03 05:17:04

+0

爲了記錄:這個函數不會找到ClosestCommonAncestor;它就是這樣命名的。我相信OP會意識到這一點,並且自此編輯了他的問題。 – ninjagecko 2012-04-03 21:19:54

1
def ClosestCommonAncestor (otu1,otu2,tree): 
    while True: 
     a = tree[otu1][0] 
     b = tree[otu2][0] 
     if a[0] == b[0]: 
      return a 
     otu1 = a 
     otu2 = b 
+0

我喜歡這個函數,但它返回一個奇怪的錯誤,KeyError :('AD',4.0) – TheFoxx 2012-04-03 05:49:18