BST с рекурсивным генератором - PullRequest
0 голосов
/ 02 мая 2020

У меня есть класс Tree, к которому я добавил рекурсивный метод in_order (кажется, работает хорошо). Поскольку я хотел бы перебрать свой объект Tree, я подумал, что могу просто реализовать ту же логику c в next , однако я получаю бесконечный генератор l oop.

Пожалуйста, дайте мне знать, что мне не хватает?

class Tree:

    def __init__(self, left=None, right=None, data=None):
        self.data=data
        self.right=right
        self.left=left

    def in_order(self):
        if self.left is not None:
            yield from self.left.in_order()
        yield (self.data)
        if self.right is not None:
            yield from self.right.in_order()

    def __iter__(self):

        return self

    def __next__(self):
        if self.left is not None:
            yield from self.left.__next__()
        yield(self.data)
        if self.right is not None:
            yield from self.right.__next__()



t4 = Tree(data=5)
t6 = Tree(data=32)
t5 = Tree(data=10)
t1 = Tree(data=8, left=t4, right=t5)
t2 = Tree(data=35, left=t6)
t3 = Tree(left=t1, right=t2, data=20)


# Works well
gen = (t3.in_order())
for e in gen:
    print(e)

# Gets into an infinite loop
for e in t3:
    print(e)

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Расширенная версия комментария:

class Tree:
    # can be simplified with @dataclass    
    def __init__(self, left=None, right=None, data=None):
        self.data=data
        self.right=right
        self.left=left

    def __iter__(self):
        if self.left is not None:
            yield from self.left
        yield (self.data)
        if self.right is not None:
            yield from self.right

     in_order = __iter__

Тест:

t4 = Tree(data=5)
t6 = Tree(data=32)
t5 = Tree(data=10)
t1 = Tree(data=8, left=t4, right=t5)
t2 = Tree(data=35, left=t6)
t3 = Tree(left=t1, right=t2, data=20)
list(t3)
# returns [5, 8, 10, 20, 32, 35]
0 голосов
/ 02 мая 2020
class Tree:

    def __init__(self, left=None, right=None, data=None):
        self.data=data
        self.right=right
        self.left=left

    def in_order(self):
        if self.left is not None:
            yield from self.left.in_order()
        yield (self.data)
        if self.right is not None:
            yield from self.right.in_order()

    def __iter__(self):
        if self.left is not None:
            yield from self.left
        yield(self.data)
        if self.right is not None:
            yield from self.right



t4 = Tree(data=5)
t6 = Tree(data=32)
t5 = Tree(data=10)
t1 = Tree(data=8, left=t4, right=t5)
t2 = Tree(data=35, left=t6)
t3 = Tree(left=t1, right=t2, data=20)


# Works well
gen = (t3.in_order())
for e in gen:
    print(e)

# Works well
for e in t3:
    print(e)

Вы делаете бесконечную рекурсию при использовании yield с __next__, если вы удалите ее, проблема решена

тест онлайн

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