为什么我不能在 Scala 中计算 100 的阶乘?
Why can't I compute the factorial of 100 in scala?
我正在进行单元测试,我无法计算 100 的阶乘。我读到过使用 BigInt 会有所帮助,但我不确定我做错了什么,因为它仍然不起作用。
这是我的功能。
package Factorial{
class factorial
{
def recursive_factorial(number:BigInt) : BigInt =
{
if (number == 0)
return 1
number * recursive_factorial (number - 1)
}
}
}
如果我用 recursive_factorial(100).. 调用函数..我得到一个错误,这个数字对于 int
来说太大了
首先你的函数存在number过大导致Whosebug的问题。你应该尾递归地写它:
@annotation.tailrec
def recursive_factorial(number: BigInt, result: BigInt = 1): BigInt = {
if (number == 0)
result
else
recursive_factorial(number -1, result * number)
}
否则,您的代码示例非常适合我,我不知道您的问题是什么。可能,您尝试在某个时候将此函数的结果(BigInt
)写入 Int
,这会触发错误。
您发布的代码工作正常。问题是您用来测试代码的代码(您在对另一个答案的评论中发布的代码):
assertResult(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000) {
factorial.recursive_factorial(100)
}
问题是整型字面量的类型是Int
,而数字93326...显然太大了不能放入一个int中,所以你不能使用整型字面量来表示它。
创建大数 BigInt 的一种方法是将其写成字符串并将其转换为 BigInt
。所以这会很好用:
assertResult(BigInt("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000")) {
factorial.recursive_factorial(100)
}
功能还行。唯一的限制是数据类型 BigInt/BigInteger 不支持 BigDecimal 可以完成的任意精度点整数运算。它的工作方式类似于 BigInt 的包装器。这就是为什么不显示大数字而是显示 9.332621544394415268169923885626674E+157 的原因。在下面的 link 中讨论了使用哪种数据类型以及何时使用。
Performace of BigDecimal vs. BigInteger and BigDecimal
我正在进行单元测试,我无法计算 100 的阶乘。我读到过使用 BigInt 会有所帮助,但我不确定我做错了什么,因为它仍然不起作用。
这是我的功能。
package Factorial{
class factorial
{
def recursive_factorial(number:BigInt) : BigInt =
{
if (number == 0)
return 1
number * recursive_factorial (number - 1)
}
}
}
如果我用 recursive_factorial(100).. 调用函数..我得到一个错误,这个数字对于 int
来说太大了首先你的函数存在number过大导致Whosebug的问题。你应该尾递归地写它:
@annotation.tailrec
def recursive_factorial(number: BigInt, result: BigInt = 1): BigInt = {
if (number == 0)
result
else
recursive_factorial(number -1, result * number)
}
否则,您的代码示例非常适合我,我不知道您的问题是什么。可能,您尝试在某个时候将此函数的结果(BigInt
)写入 Int
,这会触发错误。
您发布的代码工作正常。问题是您用来测试代码的代码(您在对另一个答案的评论中发布的代码):
assertResult(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000) {
factorial.recursive_factorial(100)
}
问题是整型字面量的类型是Int
,而数字93326...显然太大了不能放入一个int中,所以你不能使用整型字面量来表示它。
创建大数 BigInt 的一种方法是将其写成字符串并将其转换为 BigInt
。所以这会很好用:
assertResult(BigInt("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000")) {
factorial.recursive_factorial(100)
}
功能还行。唯一的限制是数据类型 BigInt/BigInteger 不支持 BigDecimal 可以完成的任意精度点整数运算。它的工作方式类似于 BigInt 的包装器。这就是为什么不显示大数字而是显示 9.332621544394415268169923885626674E+157 的原因。在下面的 link 中讨论了使用哪种数据类型以及何时使用。
Performace of BigDecimal vs. BigInteger and BigDecimal