[英]why this code send me Stackoverflow in java
我嘗試使用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
我做錯了什么?
從初始值開始,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.