2012-02-16 23 views
2

例えば、私がexchangePairs( "abcdefg")を呼び出すと、返される "badcfeg"が返されます。Javaの文字列内の文字のペアを再帰的にスワップします

これは宿題の割り当てであり、あらゆる種類の擬似コードが非常に役に立ちます。私はちょうど再帰を学び始めているし、この問題まで私はあまり問題がなかった。

+0

申し訳ありませんが、私の脳は再帰でこの問題に近づく理由を理解することさえできません! – John3136

+3

@ John3136 - これは非常に簡単です:再帰を使用して行うのは、再帰を使用して割り当てを行うためです。 –

+0

それ以外は、再帰的な解決策がここでは非常に適切です。結局のところ、Stringは空であるか、文字の後ろにStringが続きます。 (リストを後で一般化することができます)。 – Ingo

答えて

5
public String swapPairs(String s) { 
    if (s.length() < 2) 
      return s; 
    else 
      return swap(s.charAt(0), s.charAt(1)) + swapPairs(s.substring(2)); 
} 
+4

これで銀のプレートで彼を務めました。あなたは「私はあなたの宿題をする」バッジの資格を持っています。 – Ingo

0

なぜ再帰を使用するのですか? Cでありますが、それはあなたのアイデアを与える必要があります

char* exchangePairs(char* str) { 
    if (strlen(str) >= 2) { 
     // if there are characters left, swap the first two, then recurse 
     char tmp = str[1]; 
     str[1] = str[0]; 
     str[0] = str[1]; 

     exchangePairs(str + 2); 
    } 

    return str; 
} 

(私はCとのdidnでより良いよ:

for (int i = 0; i + 1 < strlen(str); ++i) { 
    char tmp = str[i + 1]; 
    str[i + 1] = str[i]; 
    str[i] = tmp; 
} 

あなたは再帰を使用する必要がある場合、私はあなたがこのような何かを行うことができたとしコピー/ペースト可能なソリューションを提供したいだけです)。

+1

再帰を使用するのは、**宿題**です。 –

+0

これはJavaではなく、Cであるはずです。 'char *'のようなものはありません。 –

+0

私はばかだとは思いません。その男は解決策を求めていませんでした。彼は正しい方向に振り向くように求めていた。彼はどんなタイプの擬似コードも問題ないと言った。これはまさに彼が探していたものです。 – daxnitro

-2

文字列がすでに交換されている整数再帰制御変数を導入します。各レベルで、制御変数をチェックして、さらに行うべきかどうかを確認し、そうであれば、次のペアを交換し、2ずつ増分して再帰させます。

+0

その必要はありません。すべての文字列にはすでにこの制御変数があります。これは '.length'と呼ばれます – Ingo

0

使用末尾再帰

String reverse(String input) 
{ 
    if(String.length()==1) 
    { 
    return input; 
    } 
    else 
    { 
     return reverse(input,""); 
    } 
} 

String reverse(String input, String result) 
{ 
    if(input.length == 0) return result; 
    else return result(input.substring(1),input.charAt(0) + result); 
} 
+0

私は、テール再帰は、単に再帰の基本を開始する人にとっては遠すぎるステップだと言います。 – Steven

1

あなただけの再帰があなたの毎日のライブの一部であるため、再帰を学ぶために始めていません。あなたは気づいていません。なぜなら、それは普通のことであり、誰もそれを再帰と呼んでいないからです。

たとえば、テレビで映画を観ると、あるシーンではテレビで映画を見ている人がいます。

プログラミングでは、再帰は難しいことを簡単にする方法です。簡単なケースから始めてください:

  • exchangePairs( "")の結果は何ですか?
  • xが任意の文字であるexchangePairs( "x")の結果は何ですか?
  • あなたがすでにexchangePairs()を完了しているとしたら、結果は "xy ..."となります。 "..."は任意の文字列ですか?確かに "yx +++"、ここで "+++"はexchangePairs( "...")の結果です。

ここですべてのケースをカバーしていることが判明しました。問題が解決しました! これは再帰の偉大さです。まだ完成していないにもかかわらず、完成したかのように機能を使用するだけです。

0

ここに私の解決策があります。私は自由にJavaを使っていないので、Javaと非常によく似ているC#でそれをやったので、理解しやすくする必要があります。方法に

public static char[] exchangePairs(char[] charArray, int current) 
     { 
      if(current >= charArray.Length - 1) 
      { 
       return charArray; 
      } 

      char nextChar = charArray[current + 1]; 
      char currentChar = charArray[current]; 

      charArray[current] = nextChar; 
      charArray[current + 1] = currentChar; 

      int i = current + 2; 

      return exchangePairs(charArray, i); 
     } 

コール:

exchangePairs( "ABCDEFGHIJ" .ToCharArray()、0);

0
public static String swapPairs(String s) { 
    String even = ""; 
    String odd = ""; 
    int length = s.length(); 

    for (int i = 0; i <= length-2; i+=2) {   
     even += s.charAt(i+1) + "" + s.charAt(i); 
    } 

    if (length % 2 != 0) {   
     odd = even + s.charAt(length-1); 
     return odd; 
    } else { 
     return even; 
    } 
} 
+0

これは私のために働いた! – James

+0

それは良いようですが、質問は再帰的な関数を求め... –

0

スティーブンのソリューションで少し追加すると、文字列を反転するためにStringBuffer/StringBuilder.reverse()を使用できます。

public String swapPairs(String s) { 
    if (s.length() < 2) 
     return s; 
    else { 
     return new StringBuffer(s.substring(0, 2)).reverse().toString() + swapPairs(s.substring(2)); 
    } 
}