Исключение в потоке "main" java .lang.StackOverflowError по рекурсии - PullRequest
0 голосов
/ 03 апреля 2020

Я пишу код, но он работает правильно для небольших входов и требует много времени для ввода среднего размера, но для больших входов он показывает Исключение в потоке "main" java .lang.StackOverflowError вот мой код, пожалуйста, помогите мне решить эту проблему выпуск

    import java.util.*;
    public class demo{
    public static long print(long N){
    if(N==0)
        return 0;
    else if(N==1)
        return 1;
    else if(N==-1)
        return -1;
    else 
        return(2*print(N-1)+3*print(N-2));
 }
    public static void main(String[] args){
        long N;
        long cases=0;
    Scanner scan = new Scanner(System.in);
        N = scan.nextLong();
        if(N<0)
        N*=(-1);
        cases=print(N);
        System.out.println(cases); 
}
}

1 Ответ

0 голосов
/ 03 апреля 2020

Из JavaCodeGeeks:

Когда вызов функции вызывается приложением Java, в стеке вызовов выделяется кадр стека. Кадр стека содержит параметры вызванного метода, его локальные параметры и адрес возврата метода. Адрес возврата обозначает точку выполнения, с которой выполнение программы должно продолжаться после возврата вызванного метода. Если для нового фрейма стека нет места, то виртуальная машина Java (JVM) выдает ошибку StackOverflowError.

Итак, каждый раз, когда ваш метод вызывается рекурсивно, он создает новый стек. Если компьютер, на котором работает ваша программа, не может выделить память для такого большого количества стеков, JVM выдает ошибку StackOverFlowError.

В зависимости от установленной виртуальной машины Java (JVM), размер стека потока по умолчанию может равняться либо 512 КБ, либо 1 МБ. Вы можете увеличить размер стека потока, используя флаг -Xss. Этот флаг можно указать либо через конфигурацию проекта, либо через командную строку. Формат аргумента -Xss: -Xss [g | G | m | M | k | K].

...