我有以下方法,其中 self 包含如下資料結構
self.place = "India"
self.children = ["Tamil Nadu", "Karnataka"]
self.parent
方法
def get_node(self, value):
if value is None:
return self
if self.place == value:
return self
for node in self.children:
if node.place == value:
return node
elif len(node.children) > 0:
return node.get_node(value)
因此,通過遞回,我正在迭代所有可能的子節點以找到我正在尋找的節點,return node.get_node(value)但我觀察到,迭代通過“泰米爾納德邦”而不是通過“卡納塔克邦”發生。
我明白,它取了串列的第一個元素,然后從那里繼續,但不會回到串列的第二個元素。
這是遞回的預期行為還是我做錯了什么?
完整代碼(如果需要測驗)
class TreeNode:
def __init__(self, place):
self.place = place
self.children = []
self.parent = None
def add_child(self, child):
child.parent = self
self.children.append(child)
def print_tree(self):
prefix = ""
if self.parent is None:
print(self.place)
else:
prefix = prefix (" " * self.get_level() * 3)
prefix = prefix "|__"
print(prefix self.place)
for child in self.children:
child.print_tree()
def get_level(self):
level = 0
p = self.parent
while p:
level = level 1
p = p.parent
return level
def get_node(self, value):
if value is None:
return self
if self.place == value:
return self
for node in self.children:
if node.place == value:
return node
elif len(node.children) > 0:
return node.get_node(value)
def tree_map(self, nodes):
for node in nodes:
self.add_child(TreeNode(node))
def build_places():
root = TreeNode("Global")
india = TreeNode("India")
usa = TreeNode("USA")
root.add_child(india)
root.add_child(usa)
india_nodes = ["Gujarat" ,"Karnataka"]
gujarath_nodes = [ "Ahmedabad", "Baroda"]
karnataka_nodes = ["Bangalore", "Mysore"]
usa_nodes = ["New Jersey", "California"]
newjersey_nodes = ["Princeton", "Trenton"]
california_nodes = ["San Franciso", "Mountain View", "Palo Alto"]
for node in india_nodes:
india.add_child(TreeNode(node))
for node in usa_nodes:
usa.add_child(TreeNode(node))
gujarath_node = root.get_node("Gujarat")
print(gujarath_node.place)
for node in gujarath_nodes:
gujarath_node.add_child(TreeNode(node))
karnataka_node = root.get_node("Karnataka")
print(karnataka_node.place)
return root
if __name__ == "__main__":
root = build_places()
root.print_tree()
uj5u.com熱心網友回復:
問題是在你的回圈中你總是在第一次迭代中退出回圈(當節點至少有一些孩子時)。您應該只在成功時退出,而不是在遞回呼叫未成功回傳時退出。
所以把回圈改成這樣:
for node in self.children:
if node.place == value:
return node
elif len(node.children) > 0:
result = node.get_node(value)
if result:
return result
其次,在這個函式的開頭有一個奇怪的基本情況。我會替換這個:
if value is None:
return self
和:
if value is None:
return None
...因為在這種情況下您沒有尋找值:因此(在我看來)回傳節點實體是不對的(它可能具有任何值 - 您沒有驗證它)。回傳None或洗掉整個if塊而不None是以特殊方式處理似乎更一致。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/398742.html
下一篇:遞回正數求和程式
