Код возвращает ошибку переполнения стека в Java рекурсии - PullRequest
0 голосов
/ 05 марта 2020

Этот код возвращает ошибку переполнения стека, что мне делать?

/* 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);

  }

}

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Допустим, вы набираете номер 2.

1-й звонок: printStar(2). Печать hello и звонки printStar(1).

2-й звонок: printStar(1). Печатает hello и звонит printStar(0).

3-й звонок: printStar(0). Ничего не печатает, потому что n > 0 неверно. Но , все еще вызывает printStar(-1).

Ваш код вызывает следующий шаг независимо от значения n. В моем понимании того, чего вы хотите достичь, ваш рекурсивный вызов должен быть внутри блока if. Если n > 0 вернет false, просто верните что-то еще, например -1.

Код будет выглядеть так:

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

Я должен указать, однако, что я не уверен, что printStar возврат значения - хорошая идея. Возвращаемое значение всегда будет одинаковым. Вы можете изменить метод на 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);
    }
}
1 голос
/ 05 марта 2020

Ваша функция printStar будет работать вечно, потому что вы не остановите рекурсивную функцию, даже если n достигнет 0 или ниже.

...