2012-04-03 2 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

ответ

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

+0

Для записи: эта функция не найдет ClosestCommonAncestor; это было просто названо. Я считаю, что ОП осознал это и с тех пор редактировал свой вопрос. – ninjagecko

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

Смежные вопросы