1. ホーム
  2. python

[解決済み] 歩留まりを利用した再帰性

2023-02-17 21:49:07

質問

再帰処理と yield ステートメントを混ぜる方法はありますか?例えば、無限数生成器(再帰を使用)は、次のようなものです。

def infinity(start):
    yield start
    # recursion here ...

>>> it = infinity(1)
>>> next(it)
1
>>> next(it)
2

試してみました。

def infinity(start):
    yield start
    infinity(start + 1)

def infinity(start):
    yield start
    yield infinity(start + 1)

しかし、どれも私が望むようなことはしてくれず、最初のものは start を出力した後に停止し、2つ目の出力は start と表示され、次にジェネレータが表示され、そして停止しました。

注意 お願いします、while-loopを使ってできることは知っています。

def infinity(start):
    while True:
        yield start
        start += 1

これが再帰的にできるのかどうか知りたいのです。

どのように解決するのですか?

はい、できます。

def infinity(start):
    yield start
    for x in infinity(start + 1):
        yield x

ただし、これは再帰深度が最大になるとエラーになります。

Python 3.3以降では、この問題を解決するために

def infinity(start):
    yield start
    yield from infinity(start + 1)

もし、ジェネレータ関数をループさせずに再帰的に呼び出すだけなら、あるいは yield from -を使用せずに再帰的に呼び出す場合、実際に関数本体を実行したり、何かを生成することなく、新しいジェネレータを構築するだけになります。

参照 PEP 380 を参照してください。