为什么我不能计算scala中100的阶乘?
我在进行单元测试,无法计算100的阶乘。我读到使用BigInt会有帮助,但我不确定我做错了什么,因为它仍然不起作用 这是我的功能为什么我不能计算scala中100的阶乘?,scala,factorial,Scala,Factorial,我在进行单元测试,无法计算100的阶乘。我读到使用BigInt会有帮助,但我不确定我做错了什么,因为它仍然不起作用 这是我的功能 package Factorial{ class factorial { def recursive_factorial(number:BigInt) : BigInt = { if (number == 0) return 1 number * recursive_factorial (number - 1) } } }
package Factorial{
class factorial
{
def recursive_factorial(number:BigInt) : BigInt =
{
if (number == 0)
return 1
number * recursive_factorial (number - 1)
}
}
}
如果我用递归的\u factorial100调用函数。。我得到一个错误,这个数字对于int来说太大了。首先,当这个数字太大时,你的函数有导致堆栈溢出的问题。您应该以递归方式编写它:
@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.33262154439415268169923885626674e+157。下面的链接中讨论了使用哪种数据类型以及何时使用
如果我使用您的代码并添加一个合适的main方法,那么它工作得很好,因此可能错误发生在您没有显示的代码中。请发布一段可运行的代码,重现您的问题和您收到的确切错误消息。我添加了这个。{资产结果9332621544394152681699238856266700490715968264381621468599296389521759993229915089444639761561828625369792208223758251185210916864000000000000000000000000{factorial.recursive{u factorial100}