Pythonで再帰関数を作成するにはどうすればよいですか?
あなたは「再帰的」を意味したのかと思っています。 階乗関数 を計算する再帰関数の簡単な例を次に示します。
_def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
_
再帰アルゴリズムの2つの重要な要素は次のとおりです。
n == 0
_factorial(n - 1)
Pythonの再帰は、他の言語の再帰と同じように機能し、再帰構造はそれ自体で定義されます。
たとえば、再帰クラスはバイナリツリー(または任意のツリー)です。
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 __== '__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')
すでに述べたように、再帰構造には終了条件が必要です。このクラスでは、新しい要素が追加された場合にのみ再帰し、一度だけ追加されるため、それほど明確ではありません。
また、注目に値します。pythonデフォルトでは、利用可能な再帰の深さに制限があり、コンピューターのメモリーをすべて吸収しないようにします。私のコンピューターでは、これは1000です。ハードウェアなどに依存します。
import sys
sys.getrecursionlimit()
それを設定するには:
import sys #(if you haven't already)
sys.setrecursionlimit()
編集:私のバイナリツリーがこれまでで最も効率的な設計であることを保証できません。誰かがそれを改善できるなら、私はどのように聞いてうれしいです
ビルドしたいとしましょう:u(n + 1)= f(u(n))with u(0)= u0
1つの解決策は、単純な再帰関数を定義することです。
u0 = ...
def f(x):
...
def u(n):
if n==0: return u0
return f(u(n-1))
残念ながら、uの高い値を計算する場合、スタックオーバーフローエラーが発生します。
別の解決策は単純なループです。
def u(n):
ux = u0
for i in xrange(n):
ux=f(ux)
return ux
ただし、nの異なる値に対してuの複数の値が必要な場合、これは最適ではありません。配列内のすべての値をキャッシュできますが、メモリ不足エラーが発生する可能性があります。代わりにジェネレーターを使用することもできます。
def u(n):
ux = u0
for i in xrange(n):
ux=f(ux)
yield ux
for val in u(1000):
print val
他にも多くのオプションがありますが、これらが主なオプションだと思います。
再帰関数の例:
def recursive(string, num):
print "#%s - %s" % (string, num)
recursive(string, num+1)
以下で実行します:
recursive("Hello world", 0)