这个阶乘函数有什么问题(来自书:scala编程)?

时间:2014-01-03 14:50:03

标签: scala factorial

这是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中,我遇到“类型不匹配”错误......

你能告诉我这些线路有什么问题吗?

感谢您的帮助: - )

1 个答案:

答案 0 :(得分:3)

您最好使用BigInt。 不要使用BigInteger。 我知道您使用BigInteger的原因是,无论如何,本书中都有使用BigInteger的示例。

BigIntBigDecimal(在scala.math包中)适用于Scala。 BigIntegerBigDecimal(在java.math包中)适用于Java。 Scala也可以使用BigIntegerjava.math.BigDecimal,但它们并未针对Scala进行优化。隐式转换可能对他们不起作用。 (例如,IntBigInteger不会自动处理)

如果你想使用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)

由于xfactorial()的返回类型已经BigInt,因此与xfactorial()相乘会导致BigInt而非{{1} ,这可以防止溢出。 Int还支持运算符重载(在本例中为operator *和 - ),而不是Java。


此外,您可以在Scala中定义更简单的因子函数。

BigInt