2015-11-30 7 views
5

すべてのテキスト入力で完全な三角形を作成しようとしています。私は、文字列の長さが「ABCDEFGHIJ」のように、奇数であれば、私は結果がJavaでの再帰を使用したテキストピラミッド

aj 
    abij 
    abchij 
abcdghij 
abcdefghij 

になりたい「ABCDEFGHIJ」、出力は

a 
    abi 
    abchi 
abcdghi 
abcdefghi 

だろうされた文字列を持っている場合の例では、ここで何私はありますこれまでのところ、言葉のための私の出力は逆さまです。私の出力は、私がこれまで

public static void main(String[] args) { 

     solve("abcdefghij"); 

    } 

    public static void solve(String word) { 

     solve(word, word.length()/2-1); 

    } 

    public static void solve(String word, int it) { 

     // print starting spaces 
     for(int i = 0; i < it; i++) 
      System.out.print(" "); 

     // print out string 
     System.out.print(word+"\n"); 


     if(word.length() > 2) { 

      int newlengthperside = (word.length() - 2)/2; 
      solve(word.substring(0, newlengthperside) + word.substring(word.length() - newlengthperside), it-1); 

     } 
    } 

を行っている私はだけではなく、最後のAJから開始する方法についての提案を必要とする

abcdefghij 
    abcdghij 
    abchij 
abij 
aj 

です。助けてくれてありがとう。 これは宿題なので、ヒントをいただければ幸いです。

+6

リバースオーダーへの反復呼び出しの後**印刷**から始めます。 – zubergu

+0

@zubergu - 残念これは答えではなく、宿題関連の質問に対する完璧な答えです。宿題に関するコードソリューションの既存の回答に投票することはできませんので、代わりにあなたのコメントを+1します。 –

答えて

2

あなたのコードは次のようになります。

public void solve(String str) { 
    for(int i=1;i<=str.length()/2;i++) { 
     for(int j=str.length()/2-i; j>0 ;j--) { 
      System.out.print(" "); 
     } 
     System.out.print(str.substring(0,i)); 
     System.out.print(str.substring(str.length()-i)); 
     System.out.println(); 
    } 
} 

入力:

"abcdefghij" 

出力:

aj 
    abij 
    abchij 
abcdghij 
abcdefghij 

これが唯一の幸せなパスをカバーしていますが、ロジックを理解して示しています。


EDIT:再帰的なアプローチのために

:必要なスペースの
1カウント数と、後に使用される文字列でそれらを置く:

public static void solve(String word) { 
    solve(word, 0); 
} 

public static void solve(String word, int it) { 

    // print starting spaces 
    String spaces=""; 
    for(int i = 0; i < it; i++) 
     spaces+=" "; 


    if(word.length() > 2) { 
     int newlengthperside = (word.length() - 2)/2; 
     solve(word.substring(0, newlengthperside) + word.substring(word.length() - newlengthperside), it + 1); 
    } 
    System.out.print(spaces+word+"\n"); 
} 

私はいくつかのことを変更しました。

String spaces=""; 
for(int i = 0; i < it; i++) 
    spaces+=" "; 
  • (ワード0)を解きます。 (0、newlengthperside)+ word.substring(word.length() - newlengthperside)、it + 1); // - > 0 from length

  • 解決してください。 // - >長さに1を加え

  • 入力:

    solve("abcdefghij"); 
    

    出力:

    aj 
        abij 
        abchij 
    abcdghij 
    abcdefghij 
    
    +3

    私は彼が(タイトルのように)この宿題の問題を解決するために再帰を使用する必要があると信じています。 – Foleosy

    +1

    私の悪いそれを逃した!これは少なくとも彼に論理の考えを与えるべきです。 – StackFlowed

    +1

    @StackFlowedまだ助けてくれてありがとう。アルゴリズムを試して再帰を使って適用することができます。 –

    0

    スワップあなたの "//文字列プリントアウト" あなたの再帰呼び出しで行を:

    public static void solve(String word, int it) { 
        if(word.length() > 2) { 
         int newlengthperside = (word.length() - 2)/2; 
         solve(word.substring(0, newlengthperside) + word.substring(word.length() - newlengthperside), it-1); 
        } 
        // print out string 
        System.out.print(word+"\n"); 
    } 
    

    これは、最初に最も短い文字列を出力します関数が返すときには、次の最大の単語を出力します。あなたは自分自身でスペース部分を取り除かなければならないでしょうが、これはあなたにスタートを与えるはずです(再帰と "文字列のプリントアウト"の間にある既存のループが機能すると思います)。

    関連する問題