2017-04-17 152 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)返回空值,如果(条纹!= 0)你返回null。这造成了很多问题。 –

+3

必须是[同​​学](http://stackoverflow.com/q/43434546/2970947)。 –

+0

它应该以下划线开头并用*一行替换它,直到它碰到基本情况 –

回答

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

我不确定它是否会导致问题。是否有一种简单的方式来执行打印语句? –

-1

一个问题是,而不是return null;,你应该return "";两个else语句。

+0

现在它只是返回一条实线 –