Python関数の再帰とジェネレーター

高洛峰
リリース: 2017-03-03 15:08:49
オリジナル
1353 人が閲覧しました

1. 再帰とは

関数にそれ自体への呼び出しが含まれる場合、その関数は再帰的です。再帰はアルゴリズムとしてプログラミング言語で広く使用されており、通常、大規模で複雑な問題を元の問題と同様の小さな問題に変換します。再帰戦略は、複数の反復計算のみで記述できます。問題を解決するために必要なコード量が大幅に削減されます。たとえば、1 ~ 9 の 9 桁の数値の積を計算する場合、1 ~ 10000 の積を計算する場合の直感的なアルゴリズムは 1*2*3*4*5*6*7*8*9 です。 、直感的なアルゴリズムの実装は難しいですが、再帰は簡単に実装できます。例を見てください:

def fact(n):#计算给定数字到一的乘积
   if n<=1:
     return 1
   else:
     return n * fact(n-1) 
print (fact(7))
ログイン後にコピー

結果は次のとおりです: 5040

再帰的な実行プロセスを確認するために例を使用してみましょう:

def calc(n):
   print(n)
   if n/2 > 1:
     res = calc(n/2)
   return n
 calc(8)
ログイン後にコピー

結果は次のとおりです:

えー

この例をもう一度見てください:

8
4.0
2.0
ログイン後にコピー

結果は次のようになります:

def calc(n):
  print(n)
  if n/2 > 1:
    res = calc(n/2)
    print(&#39;res:&#39;,res)
  print("N:",n)
  return n
calc(8)
ログイン後にコピー

2. ジェネレーター ジェネレーターは収量のある関数です声明 。関数またはサブルーチンは 1 回しか戻りませんが、ジェネレーターは実行を一時停止して中間結果を返したり、呼び出し元に値を返して実行を一時停止したりできます。ジェネレーターの next() メソッドが呼び出されると、中断したところから正確に続行されます

以下の例を見てください:

8
4.0
2.0
N: 2.0
res: 2.0
N: 4.0
res: 4.0
N: 8
ログイン後にコピー

結果は次のようになります:

def func():
  print(&#39;11111111&#39;)
  yield [1]
  print(2222222222)
  yield 2
  print(3333333333)
  yield 3

ret=func()
r1=ret.__next__()
print(r1)
r2=ret.__next__()
print(r2)
r3=ret.__next__()
print(r3)
ログイン後にコピー

Python のループには next() 呼び出しと StopIteration の処理があり、ジェネレーター (またはそのイテレーター) を手動で反復処理する代わりに、for ループを使用するほうがずっとクリーンで見栄えがよくなります。例:

11111111
[1]
2222222222
2
3333333333
3
ログイン後にコピー

結果は前と同じです。

これらの簡単な例は、ジェネレーターがどのように機能するかを少し理解できるはずです。次に生成された値を取得する next() に加えて、ユーザーはジェネレーターに値を送り返したり [send()]、ジェネレーターで例外をスローしたり、ジェネレーターに終了を要求したりすることができます [close()]

はこちらデモンストレーション これらの機能の簡単な例。

def func():
  print(&#39;11111111&#39;)
  yield [1]
  print(2222222222)
  yield 2
  print(3333333333)
  yield 3
ret=func()
for i in ret:
  print(i)
ログイン後にコピー

ジェネレーターには、ジェネレーター [next()] を呼び出すたびに 1 ずつカウントアップする初期化された値が付属しています。本当に next() を呼び出す代わりに新しい値で send() を呼び出したい場合、ユーザーにはこの値をリセットするオプションがあります。このジェネレーターは永久に実行されるため、終了したい場合は close() メソッドを呼び出します。このコードを対話的に実行すると、次の出力が得られます:

def counter(start_at=0):
  count = start_at
  while True:
    val = (yield count) if val is not None:
    count = val
  else:
    count += 1
ログイン後にコピー

Python 関数の再帰とジェネレーターの詳細な理解に関する上記の記事は、エディターによって共有されたすべての内容です。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

Python 関数の再帰とジェネレーターに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート