2016-05-06 1 views
0

私はプログラミングに慣れていないので、今や再帰の概念になっています。私はいくつかの基本的な課題を解決しましたが、私が多次元再帰に来ると、私はひどく迷子になります。私は次の再帰を何回か解決しようとしましたが、ちょうどそれを正しく得ることはできません。メソッド内で再帰が2回呼び出されるとどうなりますか?

引数が"ABCD"2の再帰的メソッドが呼び出されます。つまり、recMethod("ABCD", 2);です。

public void recMethod(String str, int n) { 
    if(n >= 0) { 
    recMethod(str, n – 1); 
    System.out.print(str.charAt(n)); 
    recMethod(str, n – 1); 
    } 
} 

何が起こっているのか説明できる誰かがいますか?最初の再帰呼び出しは本当に私を混乱させます。

+0

質問には再帰はありません。 –

+0

メソッドの名前を変更して、例を明確にしましたが、メソッド内で名前を変更するのを忘れました。 – SirDanceAlot

答えて

3

私にとっては再帰を理解する最善の方法は、行ごとに紙に書き込むことです。私は今あなたの事件のためにした。 enter image description here

同じことをやってみてください。さらにお気軽にお問い合わせください。私は助けてください!

4

再帰について最も重要なことは、何も特別でないことです。です。それは次のステートメントを実行する前に、ステートメントを完了する必要があります方法ですべてのものと同じように:

私の例を見てみると
public void someMethod() { 
    someOtherMethod(); 
    someLastMethod(); 
} 

それはsomeOtherMethodが終了した後someLastMethodが呼び出されることは明らかです。 someOtherMethodを何か再帰的なものに置き換えても、実際には関係ありません。 someLastMethodを呼び出す前に完了する必要があります。もう一度、あなたの再帰的方法を見てみると:各呼び出しn >= 0に対して

public void recMethod(String str, int n) { 
    if(n >= 0) { 
     recMethod(str, n – 1); 
     System.out.print(str.charAt(n)); 
     recMethod(str, n – 1); 
    } else { // base case added for clarity 
     return; 
    } 
} 

System.out.print方法はrecMethodへの呼び出しを呼び出される前に呼び出す必要があります。 recMethodを呼び出すたびに、nstrというコードがあるので、コードが「非常によく似ている」以外はまったく異なるメソッドと見なすことができます。

すべての呼び出しは、ベースのケースと一致するか、またはnをデクリメントして同じメソッドの結果を必要とするため、ベースケースから開始し、nが-1のときに後方に動作します。 recMethod("ABCD",-1)に何が起こるかを想像してみてください。まあ、何も印刷しません。

次に、recMethod("ABCD",0)を参照し、それが何もしないことを知っているベースケースを呼び出し、「A」を印刷して、再び何もしない最初のステートメントと同じものを呼び出します。それで「A」を印刷します

recMethod("ABCD",1)を見ると、 recMethod("ABCD",0)が "A"を印刷した後、 "B"を印刷し、 "A"を印刷するrecMethod("ABCD",0)を呼び出します。したがって、 "ABA"を印刷します。

recMethod("ABCD",2)を見ると、 「ABA」を印刷するrecMethod("ABCD",1)が呼び出された後、「C」が印刷され、「ABA」を印刷するrecMethod("ABCD",1)が呼び出されます。それで「ABACABA」を印刷します。

recMethod("ABCD",3)を見ると、 recMethod("ABCD",2)が「ABACABA」を印刷し、「D」を印刷した後、「ABACABA」を印刷するrecMethod("ABCD",2)を呼び出します。したがって、 "ABACABADABACABA"を印刷します。

は動作しませんので、意味がありません。おそらく、コードにはこれに関するテストが必要ですか、おそらくプライベートであり、nstr境界を越えないようにするnのないパブリックなものが必要ですか?

再帰的に動作するメソッドを作成する場合は、同じことを行います。

  1. ベースケースではどうなりますか? (どのように停止する必要がありますか)

  2. メソッドが意図したとおりに動作しているかのように表現された基本ケースでない場合はどうなりますか?ここでのキャッチは、ここで同じメソッドへの各呼び出しが基本的なケースに当たるように再帰がバインドされている少し簡単な問題か、無限再帰を取得する必要があることです。

それはそれです!それが動作します。

+0

美しく明確な説明 –

+0

理想的には、それが反復解であった場合、基底のケースを打つと、メソッドの外に出るでしょう。しかし、この場合、ベースケースに当たった場合、代わりに再帰的メソッドの後にコードに移ります。右? – underdog

+0

@underdogループを使用すると、あなたのバックトラッキング構造を無視してイヤレットの終了を行うことができます。再帰では、最初の結果を調べて、それを返すか、2番目の結果を返すかを判断できます。それは同じように動作します。 Schemeでは 'call/cc'を使うこともできます。これは、最終結果を知っているのでコールスタックの待機中の作業をスキップすることができ、したがって類似性はより大きくなります。 – Sylwester

関連する問題