为大输入返回负数的阶乘函数

我的阶乘函数似乎适用于 1 到 6 之间的数字,但不适用于比 6 大得多的数字,例如以 21 开头!结果是否定的。

我不明白为什么。这是我的功能:

factorial :: Int -> Int
factorial 0 = 1
factorial 1 = 1
factorial num = num * factorial( num - 1)

这是我的二项式系数函数,它调用我的阶乘函数(也许问题来自这个?):

binomialCoef :: Int -> Int -> Int
binomialCoef n 1 = n
binomialCoef n k = factorial n `div` 
                        ((factorial k) * factorial (n - k))

回答

(...) 意识到我的阶乘函数返回从 21 开始的负数!,我不知道为什么。

因为 anInt有固定的位数。AnInt至少应该表示 -2 -29和 2 29 -1之间的所有数字,并且在 64 位系统上,通常它会表示 -2 -63和 2 63 -1之间的数字,但不管它代表什么界限,它最终将用完表示此类数字的位。

您可以使用Integer来表示任意大数:

factorial :: Integer -> Integer
factorial 0 = 1
factorial 1 = 1
factorial num = num * factorial (num-1)

例如:

Prelude> factorial 21
51090942171709440000
Prelude> factorial 22
1124000727777607680000


以上是为大输入返回负数的阶乘函数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>