2011-09-20 104 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