【问题标题】:Scala Factorial method gives me wrong result, why?Scala Factorial 方法给了我错误的结果,为什么?
【发布时间】:2015-05-01 15:56:23
【问题描述】:

您好,我正在研究 scala 上的一些示例。有一种称为 product 的方法,它将给定函数在给定数字范围内的所有结果相乘。

例如。 product(somefunction: Int => Int) (lowerborder: Int, upperborder: Int)

以下将给定范围内的所有阶乘结果相乘:

def product(f: Int => Int)(a: Int, b: Int): Int = {
   if (a > b) 1
   else f(a) * product(f)(a + 1, b)
}

def fact(x: Int, y: Int) = product(sFact)(x, y)

def sFact(c: Int): Int = if (c == 0) 1 else c * sFact(c - 1)

fact(3, 7)

fact(3, 7) 的结果是(- 错误!):

 //> res0: Int = -1718845440

谁能告诉我为什么?

【问题讨论】:

    标签: scala


    【解决方案1】:

    结果大于 231-1 (Int.MaxValue),所以会发生数值溢出。您必须以某个值为模进行所有计算,或者在任何地方将Int 替换为LongBigInt。但是如果参数变大,Long 计算也会开始溢出(Long.MaxValue 是 263-1 == 9223372036854775807)。

    【讨论】:

    • 这就是重点,现在它正在工作,我已经忘记了这些限制......谢谢。
    【解决方案2】:

    算法对我来说看起来不错。这个函数也是一样的:

    (3 to 7).map(sFact).fold(1)(_ * _)
    

    正如@Kolmar 所说,这是类型的问题。

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2023-03-24
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多