私は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を実装するための最良の方法ではないことを読んだので、他の解決策を検討しますが、先に進む前にこれに対する答えを知りたいと思います。
再帰行では、何も返しません。 0を返したい場合は、次のような行に置き換える必要があります。
return self.insert(key, root=tmp.left)
ただの代わりに
self.insert(key, root=tmp.left)
あなたは関数の中にいて、値を返したいのですが、どうしますか?あなたが書く
def function():
return value
あなたの場合、関数呼び出しによって返された値を返したいので、そうしなければなりません。
def function():
return another_function()
しかし、あなたは
def function():
another_function()
なぜそれがうまくいくと思いますか?もちろん再帰を使用しますが、そのような場合は、PythonのZenを覚えておく必要があります。
特別な場合は、規則を破るほど特別なものではありません。