_以下问题的以下程序提供了一系列例外Exception in thread "main" java.lang.StackOverflowError
at testing_package.Compute.factorial(Compute.java:105)
我不明白为什么会出现此错误。
问题:N个男孩和M个女孩正在从剧院学习表演技巧。进行比赛 他们需要组成一组P演员,其中包含不少于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行。
答案 0 :(得分:6)
computeFactorial
避免在factorial
时调用R > N
,但在所有其他情况下调用R == N
,R < N
),传入N-R
。如果R == N
,则N-R
为0
。在factorial
中,您要检查num == 1
是否返回1
,但当num
为0
时,您正在调用factorial
使用num - 1
,-1
。然后它会使用num - 1
再次调用自己,-2
,依此类推,负数越来越大(-1
,-2
,...),直到你用完了。
我没有仔细阅读过这些代码,但至少在factorial
以及1
{{{}时需要num == 0
返回num == 1
1}})。如果你给它一个负数,我也会抛出异常。