这是Scala Book中的Programming中的阶乘函数:
// factorial function
def factorial(x: BigInteger): BigInteger =
if (x==BigInteger.ZERO)
BigInteger.ONE
else
x.multiply(factorial(x.subtract(BigInteger.ONE)))
我从我的主要功能中调用它:
// using factorial function
factorial(8)
在scala IDE中,我遇到“类型不匹配”错误......
你能告诉我这些线路有什么问题吗?
感谢您的帮助: - )
答案 0 :(得分:3)
您最好使用BigInt
。
不要使用BigInteger
。
我知道您使用BigInteger
的原因是,无论如何,本书中都有使用BigInteger
的示例。
BigInt
和BigDecimal
(在scala.math包中)适用于Scala。
BigInteger
和BigDecimal
(在java.math包中)适用于Java。
Scala也可以使用BigInteger
和java.math.BigDecimal
,但它们并未针对Scala进行优化。隐式转换可能对他们不起作用。 (例如,Int
到BigInteger
不会自动处理)
如果你想使用BigInteger
,
你可以通过
factorial(BigInteger.valueOf(8)) // Long to java.math.BigInteger
或
factorial(new BigInteger("8")) // String to java.math.BigInteger
但是,如果您使用Scala的BigInt
,则代码会变得更加简单。
// factorial function
def factorial(x: BigInt): BigInt =
if (x == 0)
1
else
x * factorial(x - 1)
// using factorial function
factorial(8)
由于x
或factorial()
的返回类型已经BigInt
,因此与x
或factorial()
相乘会导致BigInt
而非{{1} ,这可以防止溢出。 Int
还支持运算符重载(在本例中为operator *和 - ),而不是Java。
此外,您可以在Scala中定义更简单的因子函数。
BigInt