如何参考上一个节点递归地遍历节点?在下面的示例中,预期输出为4,3,2,1:
class Node:
def __init__(self, parent, value):
self.parent = parent
self.value = value
def append(self, value):
return Node(self, value)
def list(l):
print(l.value)
while l.parent is not None:
list(l.parent)
l = Node(None, 1)
l = l.append(2)
l = l.append(3)
l = l.append(4)
list(l)
答案 0 :(得分:2)
您的类结构已成功将节点的self
值传递到其子节点。问题是您的list
函数。 while l.parent is not None:
永无止境,因为循环中没有任何更改l
的值。递归调用list
将创建一个新的上下文,其中另一个名为l
的变量的值与第一个上下文的l
不同,但这对第一个l
或第一个循环。递归函数通常不需要实际循环即可迭代数据结构的元素。试试:
def list(l):
print(l.value)
if l.parent is not None:
list(l.parent)
或者:
def list(l):
while l is not None:
print(l.value)
l = l.parent
(我建议使用后者,因为如果链中有999个以上的元素,第一个将崩溃并显示“超过最大递归深度”)
结果:
4
3
2
1
奖金样式提示:考虑为函数命名而不是list
。通常,应避免覆盖内置函数和类型的名称。
答案 1 :(得分:0)
由于缺乏明确的问题陈述,我应该投票结束您的问题,但是无论如何...
在Python中的对象中,如何传递当前对象的引用
与处理任何对象相同的方式。
针对相同类别的对象b
这实际上无关紧要,但是无论如何...
这样当我打电话给b.parent时,我可以回到对象a?
class Foo(object):
def __init__(self, parent=None):
self.parent = parent
a = Foo()
b = Foo(a)
print(b.parent is a)
现在要回答您未曾提出的问题,请参阅(并接受)凯文的回答;-)