2014-01-22 99 views
0

我有幾行scala代碼定義了一個functionA,它重複調用functionB,直到n爲零(functionB n次)。每次迭代n減少1,並且如上所述更新x0。scala函數變量不能改變

def functionA(c: Double, x0: Double, n: Int): Double = { 
    require(x0>0) //This is a must 
    while(n>0){ 
     x0=functionB(c, x0) //functionB predefined 
     n-- 
    } 
    x0 
} 

的問題是,變量似乎無法改變,因爲線

x0=functionB(c, x0) 
n-- 

正在返回的錯誤。如果當前的結構沒有改變,並且線的總數保持不變,那我該怎麼寫對嗎?

回答

8

Scala中的函數參數是val s,所以你不能修改它們。

遞歸地寫你的函數。例如:

def functionA(c: Double, x0: Double, n: Int): Double = { 
    require(x0 > 0) //This is a must 
    if (n < 0) { 
    x0 
    } else { 
    functionA(c, functionB(c, x0), n - 1) 
    } 
} 
+0

這是否符合尾遞歸優化? –

+2

它應該作爲最後一行是遞歸調用。 (也許最好讓Scala編譯器用'@ tailrec'註釋驗證我們的意圖!) –

+0

這取決於。如果它是在一個「對象」中。如果它是'私人',是的。如果它是'最終',是的。否則,不會導致編譯器無法知道它在子類型中未被覆蓋。 –