2017-04-17 17 views
0

私のコードは、3で呼び出されたときに、以下の出力を出力することになっていますが、実行するたびに2行のnullが出力されます。再帰の問題

--- 
*-- 
**- 
*** 

毎回何かを変更しようとすると、実行時にスタックオーバーフローエラーが発生します。私はこの出力を修正する方法を知っていますが、再帰的には修正しません。ループを使用することは許可されていませんので、それが問題になっています。どんな助けでも大歓迎です。

public void printPattern(int n) { 
if(n>0){ 
    System.out.println(printPatternStripes(n)); 
    printPatternStripes(n-1); 
    System.out.println(printPatternStars(n)); 
    printPatternStars(n+1); 
} 
} 
    private String printPatternStars(int stars){ 
     if(stars==0){ 
     return printPatternStars(stars+1) + "*"; 


     } 
     else{ 
    return null; 
    }} 

    private String printPatternStripes(int stripes){ 
     if(stripes!=0){ 
      return printPatternStripes(stripes-1)+ "_"; 
     } 
     else{ 
     return null; 
    }} 
+1

(!星= 0)あなたはnullを返した場合と(ストライプ場合!= 0)あなたはnullを返します。これはあなたに多くの問題を引き起こしています。 –

+3

[classmate](http://stackoverflow.com/q/43434546/2970947)である必要があります。 –

+0

基本ケースに当たるまで、アンダースコアで始まり、1行に1つずつ置き換えます。 –

答えて

1

あなたはヘルパーメソッドを使用することを許可しているので、このような何かが働くだろう:

public void printPattern(int n) { 
    printHelper(n, n); 
} 

public void printHelper(int n, int initialSize) { 
    if(n > 0) { 
     printHelper(n - 1, initialSize); 
    } 

    System.out.print(stringHelper("*", n)); 
    System.out.println(stringHelper("-", initialSize - n)); 
} 

public String stringHelper(String string, int length) { 
    if (length == 0) { 
     return ""; 
    } 

    if (string.length() == length) { 
     return string; 
    } 

    return stringHelper(string + string.charAt(0), length); 
} 

使用法:

printPattern(3); 

>> --- 
    *-- 
    **- 
    *** 
+0

パラメータを変更できませんが、ヘルパーメソッドを使用できます –

+0

@ J.Doeインストラクターが 'Collections.nCopies'を使用しても問題ないと思っていることを確認してください。あなたがあなたの質問でしようとしたように、再帰を使って星の部分文字列とダッシュの部分文字列を生成したい場合、このようなライブラリメソッドを使用することを検討するかもしれません。あなたがそれらを使用できない場合、あなたは 'String.join(" "、Collections.nCopies(n、" * "))'と同じことをする独自の再帰ヘルパーメソッドを書くことができます。 – ajb

+0

問題が発生するかどうかはわかりません。 print文を書くための簡単な方法はありますか? –

-1

一つの問題ではなくreturn null;の、あなたは2つのelse文でreturn "";べきであるということです。

+0

今すぐただ1つの実線を返しています –