2017-09-26 5 views
-1

文字列を3つの部分に分割し、各部分を後方に印刷しようとしています。したがって、ユーザーが "HelloWorld"と入力すると、 "dlroWolleH"が表示されます。私はどこが間違っているのかわからない、それはペアのように反転する。3つの部分に文字列を分割し、フリップに再帰を適用します。java

import java.util.*; 
public class recursion 
{ 
    public static void main(String args[]) 
    { 
     Scanner scanner = new Scanner (System.in); 
     System.out.print("Enter a string: "); 
     String str = sc.nextLine(); 
     System.out.print(revRec3(str)); 
    } 

    public static String revRec3(String str) 
    { 
     if ((str.length() == 1)|| (str.length()==0 || str.length()==2)) 
     { 
      return str; 
     } 

     String left = str.substring(0, (str.length()/3)), 
     middle = str.substring((str.length()/3) ,(str.length()-left.length())), 
     right = str.substring((str.length()-middle.length()),str.length()); 
     String revLeft = revRec3(left); 
     String revMiddle = revRec3(middle); 
     String revRight = revRec3(right); 

     return revRight + revMiddle + revLeft; 
    }   
} 
+0

ていますか? ](https://stackoverflow.com/q/25385173/5221149) – Andreas

+0

分割の結果を印刷すると、エラーが表示されます。「HelloWorld」が「Hel」、「loWo」、「orld」に分割されています。おっとっと!! 「世界」の「o」は2回含まれています。 – Andreas

+0

また、入力が2文字*の長さで、再帰の1つになる*場合は、そのまま戻します。おっとっと!!! – Andreas

答えて

0

たぶん、あなたはこの

import java.util.Scanner; 

public class Main { 

    public static void main(String args[]) 
    { 
    Scanner sc = new Scanner (System.in); 
    System.out.print("Enter a string: "); 
    String str = sc.next(); 
    System.out.print(revRec3(str)); 
    } 



public static String revRec3(String str) 
    { 
    if ((str.length() == 1)|| (str.length()==0 || str.length()==2)) 
    { 
    return str; 
} 

String left = str.substring(0, (str.length()/3)), 
    middle = str.substring((str.length()/3) ,(str.length()-left.length())), 
    right = str.substring((str.length()-middle.length()+1),str.length()); 
String revLeft = revRec(left); 
String revMiddle = revRec(middle); 
String revRight = revRec(right); 
return revRight + revMiddle + revLeft; 


} 



private static String revRec(String middle) { 
    StringBuilder sb = new StringBuilder(middle); 
    return sb.reverse().toString(); 
    } 
} 
+2

問題は文字列を逆にする方法ではありません。プログラマの再帰アルゴリズムの熟練度をテストするための*割り当て*であり、疑問点を明確に明示している可能性があります。入力を3つの部分に分割し、部分をフリップし、各部分を再帰を使用して逆にする必要があります。答えが私の質問には役に立たないので、私の下投票。 – Andreas

+0

'new StringBuilder().reverse()。toString()'がそれを行うときに、一度に1文字ずつ文字列を追加するのはなぜですか? – Andreas

+0

更新されたコードをチェックしてください、これはあなたの問題を解決すると思います –

0

を達成しようとしているあなたはそのままの文字列を返すされた基本ケースがあります:あなたが前に文字列を逆にする必要があり、その場合には

str.length()==2 

をそれを返す。

+0

真実ですが、唯一の問題ではありません。質問に私のコメントを参照してください。 – Andreas

0

私はこれがあなたが進めてきたことだと思います。

public static void main(String args[]) 
{ 
     Scanner scanner = new Scanner (System.in); 
     System.out.print("Enter a string: "); 
     String str = sc.nextLine(); 
     System.out.print(threeSplitString(str)); 
} 

public static String threeSplitString(String str) 
{ 
    if (str.length() < 3) 
    { 
     return str; 
    } 
    int len = str.length(); 

    String p1 = str.substring(len * 0/3, len * 1/3); // First Third 
    String p2 = str.substring(len * 1/3, len * 2/3); // Second Third 
    String p3 = str.substring(len * 2/3, len * 3/3); // Third Third 

    // The recursion 
    p1 = threeSplitString(p1); 
    p2 = threeSplitString(p2); 
    p3 = threeSplitString(p3); 

    return p3 + p2 + p1; 
} 
+0

それはまだ同じことをしています。 "dlroWolleH"の代わりに "ldroWolleH" – doey

0

ここで私のJavaScriptコードは、役に立つと願っています。

function rev(input) { 
    let len = input.length; 
    if(len < 2) return input; 
    if(len == 2) return input[1]+input[0]; 
    let left = input.substring(0, Math.round(len/3)) 
    let mid = input.substring(Math.round(len/3), Math.round(len-len/3)) 
    let right = input.substring(Math.round(len-len/3), len) 

    return rev(right) + rev(mid) + rev(left); 
} 

しかし、我々は3つの部分に分かれスリップする必要がなぜ私にはわからない、我々はすでに、デバッガで、どのようにそれは私が問題の診断に役立つことができますどのような[2部

function rev(input) { 
    let len = input.length; 
    if(len < 2) return input; 
    if(len == 2) return input[1]+input[0]; 
    let left = input.substring(0, Math.round(len/2)); 
    let right = input.substring(Math.round(len/2), len); 

    return rev(right) + rev(left); 
} 
関連する問題