1

私はPythonの再帰を学んでいます。各ノードがitemnextおよび を持つリンク リストを定義しますlevel。先頭から末尾までのレベルを 0, 1, 2... で設定する再帰を書きたい

class LinkNode(object):
    """A node in a linked list."""

    def __init__(self, item, next=None):
        """(LinkNode, object, LinkNode) -> NoneType
        Initialize this node to store item and have next and level 0.
        """
        self.item = item
        self.left = next
        self.level = 0  # the level of the link

    def set_level(self, level):
        """(LinkNode, int) -> NoneType
        Set the level attribute of every node in the list
        for example: first node is 0, second is 1, third is 3...
        """
        if self is None:
            pass
        else:
            self.level = level
            levle = level + 1
            self.set_level(self.next, level)

しかし、実行すると、次のエラーが発生しました。

File "C:\Program Files\Wing IDE 101
4.1\src\debug\tserver\_sandbox.py", line 29, in <module>   File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py",
line 21, in set_level builtins.TypeError: set_level() takes exactly 2
positional arguments (3 given)

再帰呼び出しに問題はありますか?

4

3 に答える 3

0
def set_level(self, level):
    """(LinkNode, int) -> NoneType
    Set the level attribute of every node in the list
    for example: first node is 0, second is 1, third is 3...
    """
    self.level = level
    if self.next is not None:
        self.next.set_level(level+1)

self.set_level(...)メソッドを呼び出すself_levelと、インスタンスself(ドットの左側にあるオブジェクト) を最初の引数としてメソッドが呼び出されます。

したがって、の set_level メソッドを、最初の引数、2 番目の引数、および3 番目の引数としてself.set_level(self.next, level)呼び出します。selfselfself.nextlevel

LinkNode.set_level2 つの引数しかとらないため、Python はエラーを発生させます。

于 2013-03-03T19:00:57.657 に答える
0

いくつかのこと:

levle = level + 1

ここにタイプミスがあります。また、クラスコンテキストを介して何かを呼び出す場合、メソッド内で呼び出し元になるため、実際に呼び出しているselfと言うと:self.set_level

set_level(self, self.next, level)

これはあなたが望むものではありません。あなたが望むのは次のようなものです:

self.next.set_level(level)

ただし、これがリンクされたリストであることを考えると、実際にlevelは self.next の を設定しているようには見えません (これを見ると、 a ではなくa__init__を設定しているように見えます)。コードをもう一度見直して、アクセスしようとしている変数の名前が適切であることを確認します。self.nextself.left

于 2013-03-03T19:01:06.497 に答える
0

短い答え:self.next.set_level(level)の代わりに使用しself.set_level(self.next, level)ます。

(実行中の)問題は次のステートメントにあります。

self.set_level(self.next, level)

これは、set_level関数には 2 つの引数が必要ですが、3 つを渡すことを意味します。(self, self.next, level)

Python でクラス メンバー関数を定義するときは、関数が適用されるオブジェクトを識別する "self" パラメーター (名前は単なる規則です) を追加します。

そのため、いくつかのステートメントdef function(self)が呼び出されobject.function()、オブジェクトが self.argument として渡されます。

于 2013-03-03T19:05:35.760 に答える