почему я получаю java.lang.StackOverflowError здесь? - PullRequest
1 голос
/ 23 февраля 2012

_Следующая программа из приведенного ниже вопроса дает ряд исключений Exception in thread "main" java.lang.StackOverflowError at testing_package.Compute.factorial(Compute.java:105) Я не понимаю, почему я получаю эту ошибку.

Вопрос : N мальчиков и M девочек учатсяактерское мастерство из театра.Чтобы выполнить пьесу, им нужно сформировать группу из Р актеров, в которой должно быть не менее 4 мальчиков и не менее 1 девочки.Театр требует, чтобы вы написали программу, которая сообщает им, как можно сформировать группу.Примечание: Композиция должна быть уникальной, а не порядок, в котором она сделана.

import java.io.*;

class Compute {

private static int NFact;
private static int N_Minus_R_Fact;
private static int RFact;
private static int fact=0;

public static int readTheStrengthOfGroup() {
    int strengthOfGroup=0;
    try {
        System.out.println("Enter the strength of group : ");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String read = reader.readLine();
        strengthOfGroup = Integer.parseInt(read);
    } catch(Exception exc) {
        System.out.println(exc);
      }
      return strengthOfGroup;
}

public static int readTheNumberOfBoys() {
   int boysToParticipate=0;
   try {
    System.out.println("Enter the number of boys to participate in the play : ");
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String read = reader.readLine();
    boysToParticipate = Integer.parseInt(read);
   } catch(Exception exc) {
        System.out.println(exc);
     }
    return boysToParticipate;
}

public static int readTheNumberOfGirls() {
    int girlsToParticipate=0;
    try {
        System.out.println("Enter the number of girls to participate in the play : ");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String read = reader.readLine();
        girlsToParticipate = Integer.parseInt(read);
    } catch(Exception exc) {
        System.out.println(exc);
      }
    return girlsToParticipate;
}

public static int compute(int strengthOfGroup , int boysToParticipate , int girlsToParticipate) {
    if( boysToParticipate < 4 || girlsToParticipate < 1) {
        return 0;
    } else {
        /*  P >= 5 
         *  N : Boys
         *  M : Girls
         *  result = M+N C P - { (N C 0)(M C P)+(N C 1)(M C P-1)+(N C 2)(M C P-2)+(N C 3)(M C P-3)+(N C P)(M C 0) }
         */
         int resultP_2 = 0;
         int totalNumberOfParticipants = boysToParticipate + girlsToParticipate;
         int totalNumberOfParticipants_C_strengthOfGroup = computeFactorial(totalNumberOfParticipants , strengthOfGroup);
         for( int i = 0 ; i <= 4 ; i++ ) {
                          if( i == 4 ) {
                resultP_2 = resultP_2 + (computeFactorial(boysToParticipate,strengthOfGroup) * computeFactorial(girlsToParticipate,0)); 
            }else {
            resultP_2 = resultP_2 + (computeFactorial(boysToParticipate,i) * computeFactorial(girlsToParticipate,strengthOfGroup));
            strengthOfGroup--;}
         }
         int result = totalNumberOfParticipants_C_strengthOfGroup - resultP_2;
         return result;
      }
}

public static int computeFactorial(int N , int R) {
    if(R > N) {
        throw new RuntimeException("Invalid Parameters");
    } else {
        /* int NFact;
        int N_Minus_R_Fact;
        int RFact; */
        NFact = factorial(N);
        N_Minus_R_Fact = factorial(N-R);
        RFact = factorial(R);
        return( NFact / ( N_Minus_R_Fact-RFact ) );

      }
}

public static int factorial(int num) {
    if( num == 1 ) {
        return 1;
    } else {
        fact = num * factorial(num-1); // LINE 105
        return fact;
      }
}

public static void main(String args[]) {
    int strengthOfGroup = readTheStrengthOfGroup();
    int boysToParticipate = readTheNumberOfBoys();
    int girlsToParticipate = readTheNumberOfGirls();
    int result = compute(strengthOfGroup , boysToParticipate , girlsToParticipate);
    System.out.println("Number of groups that can be formed : " + result);
}

}

Я прокомментировал номер строки 105. enter image description here

1 Ответ

6 голосов
/ 23 февраля 2012

computeFactorial избегает вызова factorial, если R > N, но вызывает его во всех других случаях (R == N, R < N), передавая N-R.Если R == N, то N-R равно 0factorial вы проверяете, если num == 1, и возвращаете 1, но когда num равен 0, у вас есть factorial сам вызов с num - 1, то есть -1.Затем он снова вызывает себя с помощью num - 1, то есть -2, и так далее с постоянно увеличивающимися отрицательными числами (-1, -2, ...) до тех пор, пока не закончится стек.

Я не читал код внимательно, но, по крайней мере, вам нужно иметь factorial return 1 при num == 0, а также когда num == 1 (0! = 1).Я бы также дал исключение, если вы передадите ему отрицательное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...