繁体   English   中英

为什么这段代码在java中发送给我Stackoverflow

[英]why this code send me Stackoverflow in java

我尝试使用longdoublec, 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

我做错了什么?

从初始值开始,nk = -10。 由于这小于0,因此您的阶乘方法将永远不会返回

(number == 0)可能由于数字的二进制表示而不会发生。 即使添加了一些容差级别,这种方式仍然不完整。 您可能需要负数一致性。 (10-10可能不是零)

每次因为递归而在函数堆栈中更深入时,它会为函数变量和参数消耗更多内存,直到java无法从操作系统中获取更多内容。

c =阶乘(n)/(阶乘(k)*阶乘(nk));

对于n = 5和k = 15,

factorial(nk)将变为:factorial(-10)

接着..

number * factorial(number-1)会给我们:-10 * factorial(-11),

就像这样

无限期地继续永远不会达到0。

因此堆栈将溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM