【问题标题】:Recursion issues [closed]递归问题[关闭]
【发布时间】:2017-04-17 02:53:15
【问题描述】:

我的代码应该在使用 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;
    }}

【问题讨论】:

  • if(stars!=0) 你返回 null 并且 if(stripes!=0) 你返回 null。这会给你带来很多问题。
  • 必须是classmate
  • 它应该以下划线开头并用 * 每行一次替换它们,直到达到基本情况
  • printPatternStripes 生活的目的是返回一个值,而不是打印任何东西,就像你写的那样。这意味着您给它起错误的名称,这可能会让您感到困惑。这也意味着当您调用printPatternStripes(n-1); 时,它没有任何用处。该方法返回一个字符串,但您不打印它或任何东西。
  • 还看看printPatternStars 做了什么。看起来printPatternStars(n) 的目的是返回一个带有n 星号的字符串。那么如何返回一个 5 星的字符串呢?根据您的代码(或者您的代码在您修正错字后将是什么),您首先生成一个带有 6 颗星的字符串,然后在其中添加另一个星号。要生成一个带有 6 颗星的字符串,您需要生成一个带有 7 颗星的字符串并在其中添加另一颗星。等等。它什么时候停止?当您在StackOverflow 上崩溃时。

标签: java recursion


【解决方案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);

>> ---
   *--
   **-
   ***

【讨论】:

  • 我无法更改参数,但我可以使用辅助方法
  • @J.Doe 确保您的讲师认为可以使用Collections.nCopies。如果他们希望您使用递归来生成星号的子字符串和破折号的子字符串,就像您在问题中尝试做的那样,他们可能会考虑使用这样的库方法来作弊。如果你不能使用它们,你仍然可以编写自己的递归辅助方法,它与String.join("", Collections.nCopies(n, "*")) 做同样的事情。
  • 我不确定它是否会导致问题。有没有更简单的方法来执行打印语句?
  • @J.Doe 我同意 ajb,我会写一个递归的 String 中继器,它可以安全地替换 Collections#nCopies
  • @J.Doe 现在应该好了!
【解决方案2】:

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

【讨论】:

  • 现在只返回一条实线
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 2016-02-01
  • 2021-08-03
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多