class tree():
def __init__(self):
'''Initialise the tree'''
self.Data = None
self.Count = 0
self.LeftSubtree = None
self.RightSubtree = None
def Insert(self, data):
'''Add an item of data to the tree'''
if self.Data == None:
self.Data = data
self.Count += 1
elif data < self.Data:
if self.LeftSubtree == None:
# tree is a recurive class definition
self.LeftSubtree = tree()
# Insert is a recursive function
self.LeftSubtree.Insert(data)
elif data == self.Data:
self.Count += 1
elif data > self.Data:
if self.RightSubtree == None:
self.RightSubtree = tree()
self.RightSubtree.Insert(data)
if __name__ == '__main__':
T = tree()
# The root node
T.Insert('b')
# Will be put into the left subtree
T.Insert('a')
# Will be put into the right subtree
T.Insert('c')
再帰的という意味でしょうか?以下は、階乗関数を計算する再帰的な関数の簡単な例です。
再帰的アルゴリズムの重要な要素は次の2つです。
n == 0
factorial(n - 1)
.Pythonでの再帰は、他の言語での再帰と同じように機能し、再帰的な構成はそれ自体で定義されます。
たとえば、再帰クラスはバイナリツリー(または任意のツリー)です。
すでに述べたように、再帰構造には終了条件が必要です。 このクラスでは、新しい要素が追加された場合にのみ再帰し、1回だけ追加されるため、それほど明白ではありません。
また、注目に値するのは、デフォルトではpythonには、コンピューターのすべてのメモリを吸収しないようにするために、利用可能な再帰の深さに制限があることです。 私のコンピュータでは、これは1000です。 これがハードウェアなどによって変わるかどうかはわかりません。 あなたのものを見るために:
そしてそれを設定するには:
編集:私のバイナリツリーがこれまでで最も効率的なデザインであることを保証することはできません。 誰かがそれを改善できるなら、私はその方法を聞いて幸せです。
例えば、次のように構築するとしよう。 u(n+1)=f(u(n)) で、u(0)=u0 とします。
一つの解決策は、簡単な再帰的関数を定義することである。
残念ながら、uの高い値を計算したい場合は、スタックオーバーフローエラーに遭遇します。
もう一つの解決策は、単純なループです。
しかし、異なるnの値に対して複数のuの値が必要な場合、これは最適とは言えません。 すべての値を配列にキャッシュすることもできますが、メモリ不足のエラーに遭遇する可能性があります。 代わりにジェネレータを使うとよいでしょう。
他にもいろいろな方法がありますが、主なものはこれだけでしょう。
再帰的関数の例。
で実行します。