尝试在放置递归调用时找出放置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);
}
}
}
答案 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函数进行编码并加倍: