2016-09-01 6 views
-1

私はこのすべての可能な大文字と小文字を生成するためにこの再帰関数を使用します。ここで再帰とジェネレータの例についての説明が必要

は、コードサンプルと出力されます:

def test (name): 

    if not name: 
     yield "" 

    else: 
     first=name[:1] 

     for sub in test(name[1:]): 

      yield first.lower()+sub 
      yield first.upper()+sub 
      #print (first) 

for x in test("abc"): 
    print (x) 

出力は次のようになります:私は2つの降伏関数の下に印刷機能を追加した場合

abc 
Abc 
aBc 
ABc 
abC 
AbC 
aBC 
ABC 

と:

print(first) 

出力は次のようになります。

abc 
Abc 
a 
aBc 
ABc 
a 
b 
abC 
AbC 
a 
aBC 
ABC 
a 
b 
c 

各ステップの明確な説明と、何が起こっているのか、なぜこれらの価値があるのか​​、どのように機能するのか、再帰と発電機が一緒に私をここで失いました。

+1

あなたは発電機を扱っているという事実はここに違いはありません。 'yield'の代わりにあなたが' rege'をして再編成するのであれば、まったく同じになります。 _slicing_に慣れていれば、ジェネレータも理解しにくいはずです。最終的な発言として、「最初に」印刷することは、あなたを遠くに理解させることはありません。関数が呼び出されるたびに関数に入る**引数**を出力してみてください。 –

+0

ご返信ありがとうございます.... は、はい私はすでにそれを試してみましたが、私は 引数が 引数は 引数が「C」 引数が渡された「」 を通過した「BC」を渡されたが、問題は、あなたが理解している場合である「ABC」渡された私の心の中ですることになった、まさにました世代と再帰..ちょうど私にこのプログラムの痕跡を与えて...私はちょうどステップバイステップで動作する方法を学びたい... なぜそれが abc、Abc then aBC ...コードから次の呼び出し "最初に "b"と一致する必要があります!! 私はここで欠場する再帰について何かあります! –

答えて

0

どこで独自のトレースを作成していますか? 印刷ステートメントの使い方を知っていることがわかりました。あなたはまた、再帰トレースの他の例を検索する方法も知っていると仮定します。 StackOverflowには多くのものがあります。

あなたのコードをもう少し詳しくお聞かせください。printステートメント。

def test (name): 
    print ("ENTER test, name=", name) 

    if not name: 
     yield "" 

    else: 
     first=name[:1] 

     for sub in test(name[1:]): 
      print (" LOOP\tname", name, "\tfirst", first, "\tsub", sub) 

      yield first.lower()+sub 
      yield first.upper()+sub 
      #print (first) 

for x in test("abc"): 
    print ("YIELDED:", x) 

出力:

ENTER test, name= abc 
ENTER test, name= bc 
ENTER test, name= c 
ENTER test, name= 
    LOOP name c first c  sub 
    LOOP name bc  first b  sub c 
    LOOP name abc first a  sub bc 
YIELDED: abc 
YIELDED: Abc 
    LOOP name abc first a  sub Bc 
YIELDED: aBc 
YIELDED: ABc 
    LOOP name bc  first b  sub C 
    LOOP name abc first a  sub bC 
YIELDED: abC 
YIELDED: AbC 
    LOOP name abc first a  sub BC 
YIELDED: aBC 
YIELDED: ABC 

が、これはあなたが有益な方向に移動を取得していますか?

0

おかげで.... 昨日私はちょうど紙、ペンを取り、私は、スタックビューからこの機能をトレースし、私は...それを理解

機能が第二の手紙から自分自身を呼び出しますので、それは再帰的です関数 "test"が値 "..."で呼び出されるまで毎回全体の文字列の最後に...

私は最後から最初に... forループを毎回適用する必要があります。 最後の意志次のような変数を持つ:first = "c"、sub = ""

for each sub : 
    first.lower+sub >> c 
    first.upper+sub>> C 

はその後戻って、以前の呼び出しに、今私たちが持っている最後の結果
での最初の呼び出しに戻って、その後

first.lower()+sub > bc bC 
first.upper()+sub > bC BC 

が適用されますので、各「C」のために、それぞれの「C」のために最後の結果 がかかりますサブ= BC、BC、BC、BC と第一=「」

for each sub : 

first.lower+sub 
first.upper+sub 

abc 
Abc 
aBc 
ABc 
abC 
AbC 
aBC 
ABC 
関連する問題