1

二重リンクリストとして実装されたFIFOを作成中ですが、再帰エラーが発生する理由がわかりません。コードと受け取ったエラーを以下に投稿しました。どんな助けでも大歓迎です!

"""DLList.py"""

class DLList(object):
    """A doubly-linked list

    attributes: nl = node list"""
    def __init__(self, nl=[]):
        self.nl = nl

    def __str__(self):
        return str(self.nl)

    def __len__(self):
        return len(self.nl)

    def append(self, node):
        if not isinstance(node, DLNode):
            raise TypeError
        try:
            node.pn = self.nl[-1]
            node.pn.nn = node
            self.nl.append(node)
        except:
            self.nl.append(node)

    def pop(self):
        rn = self.nl.pop(0)
        try:
            self.nl[0].pn = None
        except:
            pass
        return rn


class DLNode(object):
    """A node in a doubly-linked list.

    attributes: self.pn = previous node, self.data = data, self.nn = next node"""
    def __init__(self, data):
        self.pn = None
        self.data = data
        self.nn = None

    def __str__(self):
        return '[%s, %s, %s]' % (self.pn, self.data, self.nn)


a = DLNode(17)
b = DLNode(15)
c = DLNode(12)
d = DLNode(46)
e = DLNode(46)

ages = DLList()
ages.append(a)
ages.append(b)
ages.append(c)
ages.append(d)
ages.append(e)

print ages.pop()

このエラーが発生しました:

File "C:\python\swampy-2.0\DLList.py", line 43, in __str__
    return '[%s, %s, %s]' % (self.pn, self.data, self.nn)
RuntimeError: maximum recursion depth exceeded

問題は、再帰を使用するつもりはなかったということです。なぜ再帰ループに入ったのか理解できません。ages.pop()は、DLNodeのインスタンスを返すことを目的としています。

4

2 に答える 2

5

ノードを出力するとき、self.pn と self.nn を出力しようとしています。それらのそれぞれは別のノードへの参照であり、印刷されると、次のノードと前のノードなどを無限に印刷しようとします。ノードのミラーの無限ホールを印刷するように求めています。

すでに印刷されたものを追跡するものは何もないため、再帰は永遠に続きます。

于 2012-07-27T15:09:56.827 に答える
1

collections.deque代わりに使用することをお勧めしますか?ライブラリでドキュメントを読むことができます。アカデミックな演習として実装を作成している場合を除き、dequeおそらくより優れています。

于 2012-07-27T15:42:58.210 に答える