欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

递归实现求 n!

程序员文章站 2024-03-15 22:17:42
...

一道经典的编程题,实现也很简单。

    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
    	}
    }
相关标签: Java知识点