为大输入返回负数的阶乘函数
我的阶乘函数似乎适用于 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