簡體   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