繁体   English   中英

Scala中的快速幂函数

[英]fast power function in scala

我试图在scala中编写一个用于快速启动功能的函数,但是我一直在获取java.lang.StackOverflowError。 我认为这与我在n / 2中递归调用此函数时在第三行中使用的两个斜杠有关。 有人可以解释为什么会这样吗

def fast_power(x:Double, n:Int):Double = {
if(n % 2 == 0 && n > 1)
        fast_power(x, n/2) * fast_power(x, n /2)
else if(n % 2 == 1 && n > 1)
        x * fast_power(x, n - 1)
else if(n == 0) 1
else  1 / fast_power(x, n)
}

您的代码不会终止,因为n = 1情况不存在。 此外,您的fast_power具有线性运行时。

如果您这样写下来:

def fast_power(x:Double, n:Int):Double = {
  if(n < 0) {
    1 / fast_power(x, -n)
  } else if (n == 0) {
    1.0
  } else if (n == 1) {
    x
  } else if (n % 2 == 0) {
    val s = fast_power(x, n / 2)
    s * s
  } else {
    val s = fast_power(x, n / 2)
    x * s * s
  }
}

那么很明显,运行时是对数的,因为在每次递归调用中n至少减半。

我对-vs- match if有强烈的意见,所以我只是将所有情况按升序排序。

建议使用match结构而不是多个if / else块。 这将帮助您找出问题所在(错误的递归调用),并编写更易于理解的递归函数。 始终将终止条件放在首位。

def fastPower(x:Double, m:Int):Double = m match {
  case 0 => 1
  case 1 => x
  case n if n%2 == 0 => fastPower(x, n/2) * fastPower(x, n/2)
  case n => x * fastPower(x, n - 1)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM