在递归Java函数调用中尝试捕获放置

时间:2011-09-20 14:36:55

标签: java

尝试在放置递归调用时找出放置try catch语句的最佳位置。使用长数据类型完成因子计算。当阶乘变得太大而无法适应长变量时,期望抛出异常。

然而,只要代码太大,代码就会显示factorial = 0。没有例外被抛出。那么try-catch放置是否存在问题,或者过大的数字是否会引发异常?

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);
    }
}
}

3 个答案:

答案 0 :(得分: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。奇怪,但却是真的。

答案 1 :(得分:0)

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

如果你想抛出这样的异常,你应该手动抛出它。顺便说一下,事实根本不是递归的,也不会做你期望的事情。

答案 2 :(得分:0)

编写的代码将始终返回1.我确定您的意思是使用return n*fact(n-1)的其他块,但我看不到它。

你可能已经过了很长时间。我建议你不要用这种方式计算阶乘。最好使用gamma函数进行编码并加倍:

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