Рекурсивно перебирать узлы, на которые ссылаются другие узлы - PullRequest
0 голосов
/ 08 марта 2019

Как я могу рекурсивно перебирать узлы со ссылкой на предыдущий узел? Ожидается вывод 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)

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Ваша структура класса уже успешно передает значение узла 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 В общем, вам следует избегать перезаписи имен встроенных функций и типов.

0 голосов
/ 08 марта 2019

Я должен проголосовать, чтобы закрыть ваш вопрос из-за отсутствия четкого определения проблемы, но в любом случае ...

Как передать объект моего текущего объекта в 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)

Теперь ответ на вопрос, который вы не задавали, смотрите (и принимайте) ответ Кевина; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...