簡體   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