web-dev-qa-db-ja.com

Python再帰とreturnステートメント

私はPythonと再帰関数全体にかなり慣れていないので、私の無知を許してください。

Pythonでバイナリ検索ツリーを実装しようとしていますが、次の挿入メソッドがあります(クラスから取得):

def insert(self, key, root=None):
    '''Inserts a node in the tree'''
    if root == None:
        root = self.root
    if root.key == None:
        self._update(root, key)
        return 0
    else:
        tmp = root
        if key > tmp.key: # we work with the right subtree
            self.insert(key, root=tmp.right)
        Elif key < tmp.key: # we work with the left subtree
            self.insert(key, root=tmp.left)
        else: # key already exists
            return 0

これが判読できるかどうかはわかりませんが、None値に達するまでツリーをトラバースし、挿入するキーでノードを更新します。

これで、このメソッドはうまく機能し、BSTを最初から正しく作成します。ただし、再帰が実行されていない場合にのみ0を返すため、returnステートメントには問題があります。

>>> bst.insert(10)
0
>>> bst.insert(15)
>>> bst.root.right.key
15
>>>

ルートキーを「挿入」すると、(15行目から)本来の方法で0が返されます。

>>> bst.insert(10)
0

なぜこれが起こるのか理解できません。 6行目にprintステートメントを配置すると、正しく実行されますが、最初の挿入以降は何も返されません。どうしてこれなの? (Pythonと再帰)に関する基本的な情報が不足していると確信しています)

ご協力いただきありがとうございます、

イワン

追伸:再帰はBSTを実装するための最良の方法ではないことを読んだので、他の解決策を検討しますが、先に進む前にこれに対する答えを知りたいと思います。

17
imiric

再帰行では、何も返しません。 0を返したい場合は、次のような行に置き換える必要があります。

return self.insert(key, root=tmp.left)

ただの代わりに

self.insert(key, root=tmp.left)
24
Nathaniel Flath

あなたは関数の中にいて、値を返したいのですが、どうしますか?あなたが書く

def function():
    return value

あなたの場合、関数呼び出しによって返された値を返したいので、そうしなければなりません。

def function():
    return another_function()

しかし、あなたは

def function():
    another_function()

なぜそれがうまくいくと思いますか?もちろん再帰を使用しますが、そのような場合は、PythonのZenを覚えておく必要があります。

特別な場合は、規則を破るほど特別なものではありません。

18
DasIch