2011-07-28 16 views
1
using System; 

class RevStr { 

    public void displayRev(string str) { 
    if(str.Length > 0) 
     displayRev(str.Substring(1, str.Length-1)); 
    else 
     return; 

    Console.Write(str[0]); 
    } 
} 

class MainClass { 
    public static void Main() { 
    string s = "this is a test"; 
    RevStr rsOb = new RevStr(); 

    Console.WriteLine("Original string: " + s); 

    Console.Write("Reversed string: "); 
    rsOb.displayRev(s); 

    Console.WriteLine(); 

}}このC#プログラムで再帰がどのように機能しますか?

答えて

1

これが反転文字列を出力再帰的方法です。文字列strを反転して印刷するには、最初にstrの文字を反転させずに(再帰的な手順)印刷し、最初の文字を印刷します。 dcb、次いでa(最初の文字)が印刷されabcd逆に、印刷bcd反転を印刷する。例えば

+0

これは技術的に正しくありません:このリンクは場合に役立ちます

を参照してください。 'bcd'は全く反転しません。一度に1文字しか印刷しません。再帰は事実上、それを逆に印刷することができます。それは、文字列の各セグメントを別々に管理し、スタックにプッシュされた文字列の最初の文字だけの 'Console.Write()'を行います。 – McArthey

+0

@Macarthey - これは再帰的なステップです。私は本質的に背後にある論理を説明している。スタックが使用されるという技術的な詳細はありません。 'bcd'をもう一度印刷すると' cd'が逆になり 'b'が表示されます。 –

+0

@McArthey、あなたは間違っている、説明は完璧です、そこに動くターゲットはありません、それは単なる静的な定義です。 – unkulunkulu

2

文字列が内容を持つ限り、再帰呼び出しが最初であるため、1文字少ない文字で再帰的に呼び出します。一度にすべての文字がなくなると、呼び出しは一度に1文字ずつ印刷し直します。あなたは(小さな文字列の)コールスタックに

displayRev("test") 
displayRev("est") 
displayRev("st") 
displayRev("t") 
displayRev("") // unwinds here 

を取る場合は、それぞれの最初の文字を見て、それを書き留めのであれば、それは、TSET、テストの逆になるのでそれは逆方向に印刷します。

1

例外をスローします。

例:

displayRev("bla"); 
displayRev("la"); 
displayRev("a"); 
//Now it gets an error 
//The string.Length "a" is bigger than 0 (it´s 1) 
//in displayRev(str.Substring(1, str.Length-1)); he wants to make a SubString beginning at the 
//index 1 (the Second character), but the string contains only 1 character 

//if-Statement have to look like: 

if(str.Length > 1) 
     displayRev(str.Substring(1, str.Length-1)); 
    else 
     return; 
0

たぶん、再帰を考えるための最も簡単な方法は、スタックの通りです。実際、スタックと再帰を検索すると、スタックを使用して再帰を実装する多くの方法がわかります。
コードでは、最初の文字を効果的に取り除き、残りをスタックにプッシュします。スタックを "ポップ"する必要がある条件を満たすと、スタック上の各要素に対してConsole.Write()ステートメントが実行されます。あなたの場合は、スタックにプッシュされた文字列の最初の文字を出力することを意味します。 StackはLIFO(Last In、First Out)順で処理されるので、逆順で文字列を処理することに注意してください。 The Animation of Recursion, Simple String Reversal

+1

最初の回の再帰が見られる場合、スタックは最も簡単な方法ではありません。主なアイデアは、問題を部分問題に分割し、それらを解決することです(おそらく同じ関数によって)。 – unkulunkulu

+0

@unkulunkulu私はOPにソリューションを見るための別の方法を提供したかったので、私は 'maybe'でコメントを序文にしました。確かに多くの視点を持ち、スタックのコンセプトについて言及していないのは、私の考えでは再帰に関する議論には役立たないということです。 – McArthey

+0

ええ、正確にこの理由のために私はこの質問のためのすべての答えが好きです:) – unkulunkulu