递归实现求 n!
一道经典的编程题,实现也很简单。
private static int Factorial(int n) {
if (n == 0 || n == 1) return 1;
return n * Factorial(n - 1);
}
//测试方法
public static void main(String[] args) {
System.out.println(Factorial(10));//结果正确输出3628800
}
上面的程序已经可以实现递归求 n! ,不过有瑕疵,瑕疵在于 int 类型 ,当n取值100时,结果会成0;原因是内容超出了变量本身的长度。例如:int等于4个字节,而每个字节又等于8位,故而得之长度为32位。而通过123…*35的时候发现结果超出变量本身长度,导致二进制转换丢失多32位的数据,十进制化之后结果为0。
稍加修改程序
private static BigInteger Factorial(BigInteger n) {
BigInteger bigInteger = new BigInteger("1");
if (n.compareTo(bigInteger) == 0 || n.compareTo(new BigInteger("0")) == 0) return bigInteger;
return n.multiply(Factorial(n.subtract(bigInteger)));
}
修改后的程序使用到了BigInteger类,简单叙述BigInteger:BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。他可以和好的解决精度丢失的问题。
BigInteger构造方法
//传入字符串类型数值以及进制
BigInteger bigInteger_1 = new BigInteger("1000", 2);
//BigInteger默认进制为十进制
BigInteger bigInteger_2 = new BigInteger("1000");
BigInteger基本运算方法
BigInteger a = new BigInteger("3");
BigInteger b = new BigInteger("4");
//1.加
BigInteger num1 = a.add(b);
//2.减
BigInteger num2 = a.subtract(b);
//3.乘
BigInteger num3 = a.multiply(b);
//4.除
BigInteger num4 = a.divide(b);
除了以上列举的运算方法,BigInteger还有很多:绝对值、取反、取模等等。可以翻看API使用。
BigInteger比较大小方法:compareTo()
compareTo()返回一个int型数据:1 大于; 0 等于; -1 小于;
BigInteger a = new BigInteger("3");
BigInteger b = new BigInteger("4");
System.out.println(a.compareTo(b)); // -1
解决了精度丢失的问题,还有一个问题,如果n值非常大,会引发 *Error错误。
每一个 JVM 线程都拥有一个私有的 JVM 线程栈,用于存放当前线程的 JVM 栈帧(包括被调用函数的参数、局部变量和返回地址等)。如果某个线程的线程栈空间被耗尽,没有足够资源分配给新创建的栈帧,就会抛出 java.lang.*Error 错误。这个错误可以根据实际情况采取合适的解决方案,对这一区域的知识不够深入,仅做捕获提示。
private static BigInteger Factorial(BigInteger n) {
BigInteger bigInteger = new BigInteger("1");
if (n.compareTo(bigInteger) == 0 || n.compareTo(new BigInteger("0")) == 0) return bigInteger;
return n.multiply(Factorial(n.subtract(bigInteger)));
}
public static void main(String[] args) {
try{
Factorial(new BigInteger("5000"));
}catch(Error error){
// TO DO
}
}
上一篇: Unity 射线碰撞检测
下一篇: Java 实现求1+2+3+…+n