この種の相互の「再帰」と呼ばれるものは何ですか?
-
28-09-2019 - |
質問
私の問題は、再帰に非常に似ているが、そうではない特定のスタイルのコードに関するものです とても それ。再帰は、引用することです ウィキペディア, 、「定義されている関数が独自の定義内で適用される機能を定義する方法」。同様に、相互の再帰は、私たちが定義している関数を直接的または間接的に適用する別の関数を適用します。
問題は、私が考えているコードが同じ関数を使用していないことです!同じものを使用します コード 別の関数(方法または閉鎖として)。
ここでの問題は、私のコードは同じですが、関数はそうではないということです。次の基本的な相互再帰の例を見てください:
def is_even(x):
if x == 0:
return True
else:
return is_odd(x - 1)
def is_odd(x):
if x == 0:
return False
else:
return is_even(x - 1)
これはやや直感的であり、非常に明確に相互に再帰的です。ただし、各機能をすべての呼び出しに一度作成する内部関数としてラップアップすると、あまり明確になりません。
def make_is_even():
def is_even(x):
if x == 0:
return True
else:
return make_is_odd()(x - 1)
return is_even
def make_is_odd():
def is_odd(x):
if x == 0:
return False
else:
return make_is_even()(x - 1)
return is_odd
def is_even2(x):
return make_is_even()(x)
def is_odd2(x):
return make_is_odd()(x)
暗黙的なメモ化などの最適化などを無視すると、これにより、厳密に再帰的ではない関数呼び出しが生成され、同じ機能を2回呼び出すことなく、さまざまな新しい機能を作成および呼び出します。それにもかかわらず、これらすべての関数は共通のテンプレートに従い、何度も何度も作成された関数と同じだけです(おそらく異なる自由変数があります。
繰り返しますが、クラスを使用した直接的な同等のものを思いつくことができます(結局のところ、クラスは実際には閉鎖です。)実装が実装されます。このスタイルのため、これは特に重要です ここに名前を挿入 例えば、 複合パターン. 。違いは、複合設計パターン、およびほとんどの用途(閉鎖の場合でも)では、インスタンスは通常、その場で作成されないことです。それはまだ本質的に同じです。
class EvenChecker(object):
def check(self, x):
if x == 0:
return True
else:
return OddChecker().check(x - 1)
class OddChecker(object):
def check(self, x):
if x == 0:
return False
else:
return EvenChecker().check(x - 1)
def is_even3(x):
return EvenChecker().check(x)
def is_odd3(x):
return OddChecker().check(x)
今回はチェーンはオブジェクトの作成とメソッド呼び出しの呼び出しですが、原則は同じです。 (私は実際にそれがわずかに異なることに注意してください。Pythonは、それ自体が毎回まったく同じ関数を呼び出すオブジェクトごとの単純なラッパーを定義するという点で、必ずしも私たちが知る必要があるものではなく、そうではありません。クラスやオブジェクトの他の実装には真実である必要があります。しかし、はい、厳密に言えば は 相互に再帰的であり、...それ以上のもの、そしてそれは私が知りたい他のことです。)
解決
あなたが指摘するように、これはまだ相互の再帰です。あなたが尋ねている「もっと何か」には名前があるとは思わない。もしそうなら、私はそれを聞いたことがありません。