Я написал алгоритм для рекурсивного получения глубины дерева. В определении функции, она работает:Алгоритм глубины дерева работает как определение функции, но не как определение метода
def tree_depth_f(tree):
"""Counts the maximum depth of a tree."""
def recursive_count(node):
"""Recursive count function."""
childs = tree[node]
if childs == None:
return 0
else:
maxh = 0
for i in xrange(len(childs)):
h = recursive_count(childs[i])
if maxh < h:
maxh = h
return int(1 + maxh)
root = tree['root']
depth = recursive_count(root)
return depth
Но тот же алгоритм, как определение метода не работает:
class MyClass:
def __init__():
pass
def tree_depth(self, tree):
"""Counts the maximum depth of a tree."""
def recursive_count(node):
"""Recursive count function."""
self.childs = tree[node]
if self.childs == None:
return 0
else:
self.maxh = 0
for i in xrange(len(self.childs)):
self.h = recursive_count(self.childs[i])
if self.maxh < self.h:
self.maxh = self.h
return int(1 + self.maxh)
self.root = tree['root']
self.depth = recursive_count(self.root)
return self.depth
tree
это словарь списков. Это, как я проверяю эти коды:
tree = {0: [1], 1: [2], 2: [3, 4], 3: None, 4: None, 'root': 0}
m = MyClass()
print "As a function:", tree_depth_f(tree)
print "As a method:", m.tree_depth(tree)
Вот графическое представление tree
в этом примере:
Определение функции работает нормально, но когда я использую метод определение, я получаю следующее сообщение об ошибке:
TypeError: 'NoneType' object has no attribute '__getitem__'
at Answer.py. in recursive_count on line 102
at Answer.py. in recursive_count on line 102
at Answer.py. in recursive_count on line 102
at Answer.py. in tree_depth on line 108
at Answer.py. in <module> on line 157
Линия 102, 108 и 157 в исходной точке коды к ним:
102: self.h = recursive_count(self.childs[i])
108: self.depth = recursive_count(self.root)
157: print "As a method:", m.tree_depth(tree)
После много отладки, я обнаружил, что, когда определение метода находит лист (узел которого self.childs
является None
) и начинает возвращаться из рекурсии, self.childs
родительского узла None
тоже. Понятия не имею почему. Определение функции работает нормально. Не могли бы вы, ребята, помочь мне?
'm = MyClass()'. – Amadan
@Amadan Я ошибся здесь, но в исходном коде это было правильно. Это не проблема. Кроме того, если бы я забыл скобки в исходном коде, сообщение об ошибке было бы совершенно другим. – renatov
Да. Но это заставляет нас отлаживать неправильную проблему. Почему бы не убедиться, что код является исполняемым, прежде чем поставить его под вопрос? – Amadan