2011-09-20 29 views
0

試圖找出最好的地方放一個try catch語句時,遞歸調用放置。階乘計算使用長數據類型完成。當階乘變得太大而不適合長變量時,期望有一個異常被拋出。的try-catch放置在一個Java的遞歸函數調用

但是代碼是表示階乘= 0時它是太大。沒有例外被拋出。那麼是否存在嘗試抓取位置的問題,或者是否將過大的數字引發異常?

class Fact 
{ 
    static long fact(long n) 
    { 
     if(n==1) 
      return 1; 
     return n*fact(n-1); 
    } 

public static void main(String args[]) 
{ 
    try{ 
     long f = fact(555); 
     System.out.println("Factorial = "+f); 
    } 
    catch(Exception e){ 
      System.out.println("Exception = "+e); 
    } 
} 
} 
+0

見http://stackoverflow.com/questions/3001836/how-does-java-handle-integer-underflows-and-overflows-and-how:使用伽瑪功能和雙打更好地碼-would-you-check-for – BlackJack

+1

這段代碼是如何編譯的? long方法只在n等於時返回一個值。 – leifg

+0

對不起,每個人當我把它粘貼到SO中時,我都會錯過部分代碼。它現在被添加。 – AruniRC

回答

2

整數溢出不會在Java中引發任何異常。整數除以零拋出ArithmeticException,但不溢出。

的問題現在已演變成「爲什麼這回零?」答案是,這只是一個巧合。如果修改這樣的功能:

static long fact(long n) 
{ 
    if(n==1) 
     return 1; 
    long result = n*fact(n-1); 
    System.out.println(n + ", " + result); 
    return result; 
} 

再看看輸出,你(我刪除中間和結束時的一些行):

2, 2 
3, 6 
4, 24 
5, 120 
6, 720 
7, 5040 
8, 40320 
... 
19, 121645100408832000 
20, 2432902008176640000 
21, -4249290049419214848 
... 
60, -8718968878589280256 
61, 3098476543630901248 
62, 7638104968020361216 
63, 1585267068834414592 
64, -9223372036854775808 
65, -9223372036854775808 
66, 0 
67, 0 
... 

,然後一旦它擊中零,從此以後它是零。經過幾次跳躍和溢出之後,您的產品意外碰到一個數字,最低有效位爲64。奇怪,但是是真的。

+0

所以像,如果n超過'Integer.MAX_SIZE'anytime然後該程序就必須明確地拋出異常。如果發生溢出,那麼類型將包裝,如(值)mod MAX_SIZE。這裏輸出總是0。 – AruniRC

+0

謝謝,現在很清楚。並且問題可能會從答案中得到輸入,使實際問題更加清晰。 – AruniRC

0
static long fact(long n) throws Exception 
    { 
     if (//when you want to throw exception){ 
      throw new Exception(); 
     } 
     if(n==1) 
      return 1; 
    } 

如果你想拋出這樣的異常,你應該手動拋出它。順便說一句,事實根本不是遞歸的,不會做你期望的事情。

0

的代碼,寫,總是返回1.我敢肯定,你的意思是有一個else塊以return n*fact(n-1),但我沒有看到它。

你可能溢出長。我建議你不要這樣計算因式分解。

http://mathworld.wolfram.com/GammaFunction.html

+1

實際上發佈的代碼不應該編譯,因爲缺少返回語句。以某種方式粘貼到SO中時錯過了 – Thomas

+0

。現在更正。 – AruniRC