java - 返回一些负数的递归阶乘方法

标签 java factorial

这是我的阶乘方法:

public static long factorial(int num1) {
    if (num1 <= 1) 
        return 1; 
    else
        return num1 * factorial(num1 - 1);
}

这就是所谓的递归阶乘方法:

for (i = 0; i <= 25; i++)
    System.out.printf  ("%d !=  %,d\n", i, factorial (i));

到目前为止一切顺利,起初输出似乎是正确的,但一些阶乘是负数而不是正数:

OUTPUT:
0 !=  1
1 !=  1
2 !=  2
3 !=  6
4 !=  24
5 !=  120
6 !=  720
7 !=  5,040
8 !=  40,320
9 !=  362,880
10 !=  3,628,800
11 !=  39,916,800
12 !=  479,001,600
13 !=  6,227,020,800
14 !=  87,178,291,200
15 !=  1,307,674,368,000
16 !=  20,922,789,888,000
17 !=  355,687,428,096,000
18 !=  6,402,373,705,728,000
19 !=  121,645,100,408,832,000
20 !=  2,432,902,008,176,640,000
21 !=  -4,249,290,049,419,214,848
22 !=  -1,250,660,718,674,968,576
23 !=  8,128,291,617,894,825,984
24 !=  -7,835,185,981,329,244,160
25 !=  7,034,535,277,573,963,776

21、22、24都是负数,为什么会这样?这是某种“除以 0”的悖论吗?

最佳答案

你长满了。您需要根据包含长值的二进制数来考虑它。只要您将 1 加到 long 可以包含的最大正值,它就会滚动到负最小值。

您可能需要阅读本文以获得完整的理解。 http://en.wikipedia.org/wiki/Two%27s_complement

在 Java 中,您可以使用 BigInteger 来获取更大的值 http://docs.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html

关于java - 返回一些负数的递归阶乘方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181638/

相关文章:

java - 在 JavaFX 中更改树单元格选定的字体颜色

c - 并行化阶乘计算

无法计算大于 20 的阶乘! !怎么做呢?

c - 简单递归题

algorithm - 阶乘尾随零 BigO 问题

java - 如何将枚举声明为类型?

java - 使用 jQueryUI datepicker 和 php 获取一系列日期(西类牙语)

java - Android 中无法使用 JAVA 解决异常处理程序?

java - Hibernate 在调用 bean 类的 setter 方法时更新记录

r - 绘制 2x2x2 时间序列的原始值和预测值