我尝试将long
和double
与c, k, n
变量一起使用,但netbeans向我显示了堆栈溢出错误:
public class Main {
public static void main(String[] args) {
double c=0; //combinatorial
double n=5;
double k=15;
c= factorial(n)/(factorial(k)*factorial(n-k));
System.out.print(n+" combinatorial "+k+" between "+c+"\n");
}
static double factorial (double number) {
if (number == 0)
return 1;
else
return number * factorial(number-1);
}
}
Exception in thread "main" java.lang.StackOverflowError
at co.combinatorial.Main.factorial(Main.java:26)
at co.combinatorial.Main.factorial(Main.java:29)
at co.combinatorial.Main.factorial(Main.java:29)
at co.combinatorial.Main.factorial(Main.java:29)
......
Java结果:1
我是否必须使用整数文字或long.parselong
我做错了什么?
答案 0 :(得分:19)
从初始值开始,n-k = -10。由于这小于0,因此您的阶乘方法将永远不会返回
答案 1 :(得分:3)
(数字== 0)。即使添加了一些容差级别,这种方式仍然不完整。您可能需要负数一致性。 (10-10可能不是零)
每次因为递归而在函数堆栈中更深入时,它会为函数变量和参数消耗更多内存,直到java无法从操作系统中获取更多内容。
答案 2 :(得分:2)
c =阶乘(n)/(阶乘(k)*阶乘(n-k));
对于n = 5且k = 15,
阶乘(n-k)将变为:阶乘(-10)
然后..
number * factorial(number-1)会给我们:-10 * factorial(-11),
并且像这样
无限期地永远不会达到0。
因此堆栈会溢出。