代码 returns Java 递归中的堆栈溢出错误

Code returns Stack overflow error in Java recursion

此代码返回堆栈溢出错误,我该怎么办?

/* package whatever; // don't place package name! */

import java.io.*;

class myCode
{
  public static void main (String[] args) throws java.lang.Exception
  {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String input = br.readLine();

    System.out.println(printStar(Integer.parseInt(input)));
  }


    private static int printStar(int n){
    if(n > 0){
        System.out.print("\n hello");

    }
      return printStar(n-1);

  }

}

您的 printStar 函数将永远继续,因为即使 n 命中 0 或以下,您也不会停止递归函数。

假设您输入数字 2。

第一次通话:printStar(2)。打印 hello 并调用 printStar(1).

第二次通话:printStar(1)。打印 hello 并调用 printStar(0).

第 3 次通话:printStar(0)。不打印任何内容,因为 n > 0 为假。 但是,仍然调用printStar(-1)

您的代码正在独立于 n 的值调用下一步。根据我对你想要实现的目标的理解,你的递归调用应该在 if 块内。如果 n > 0 return 为假,则只是 return 其他内容,例如 -1.

代码如下所示:

private static int printStar(int n) {
    if (n > 0) {
        System.out.print("\n hello");
        return printStar(n - 1);
    }
    return -1;
}

不过,我必须指出,我不确定 printStar return 是否是一个好主意。 returned 值将始终相同。您可以将方法更改为 void。您的整个代码如下所示:

public static void main(String[] args) throws java.lang.Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String input = br.readLine();

    printStar(Integer.parseInt(input));
}

private static void printStar(int n) {
    if (n > 0) {
        System.out.print("\n hello");
        printStar(n - 1);
    }
}