Я новичок в Python и алгоритмах, и я хочу объявить функцию внутри класса, а не за его пределами. Вот что у меня есть сейчас:
Общая реализация класса дерева NAryTree:
class NAryTree:
def __init__(self, key):
self.key = key
self.children = []
def __str__(self):
return str(self.key)
def addChild(self, tree):
self.children.append(tree)
def getChild(self, k):
return self.children[k]
def getNChildren(self):
return len(self.children)
def __iter__(self):
return self.children.__iter__()
def __next__(self):
return self.children.__next__()
Функция minSubtree(tree) для вычисления минимальной суммы поддерева:
def minSubtree(tree):
value = tree.key
for child in tree:
value += min(minSubtree(child), 0)
return value
И функция Build Tree buildMyNAryTree():
def buildMyNAryTree():
root = NAryTree(1)
root.addChild(NAryTree(-2))
root.addChild(NAryTree(3))
root.addChild(NAryTree(4))
root.getChild(0).addChild(NAryTree(-5))
root.getChild(1).addChild(NAryTree(6))
root.getChild(1).addChild(NAryTree(7))
root.getChild(2).addChild(NAryTree(-8))
root.getChild(0).getChild(0).addChild(NAryTree(-9))
root.getChild(0).getChild(0).addChild(NAryTree(-10))
root.getChild(0).getChild(0).addChild(NAryTree(11))
root.getChild(1).getChild(0).addChild(NAryTree(-4))
root.getChild(1).getChild(1).addChild(NAryTree(12))
root.getChild(1).getChild(1).addChild(NAryTree(-13))
root.getChild(2).getChild(0).addChild(NAryTree(14))
return root
Я хочу объявить minSubtree(tree) внутри класса, но я не знаю, как изменить параметр. Другими словами, я хочу вернуть минимальную сумму поддерева, используя buildMyNAyTree().minSubtree() вместо minSubtree(buildMyNAryTree()).






Я думаю, это должно делать то, что вы хотите:
Он выполняет итерацию по дочерним элементам дерева и вызывает команду minSubTree дочернего элемента.
class NAryTree:
def __init__(self, key):
self.key = key
self.children = []
def __str__(self):
return str(self.key)
def addChild(self, tree):
self.children.append(tree)
def getChild(self, k):
return self.children[k]
def getNChildren(self):
return len(self.children)
def __iter__(self):
return self.children.__iter__()
def __next__(self):
return self.children.__next__()
def minSubtree(self):
value = self.key
for child in self.children:
value += min(child.minSubtree(), 0)
return value
Сделайте отступ для функции внутри тела класса и по соглашению переименуйте tree в self. Доступ к child.minSubtree() вместо minSubtree(child).
class NAryTree:
# your other methods
def minSubtree(self):
value = self.key
for child in self:
value += min(child.minSubtree(), 0)
return value
print(buildMyNAryTree().minSubtree()) производит -32.
Вы можете использовать
for child in self, потому что экземплярыNAryTreeуже являются итеративными.