我需要幫助來找到正確的 Scala 方法,以使該代碼更具功能性且不那么可變。
def findMinTime(str: String, timeByCar: Int): Int = {
var myTime = timeByCar
var minTime = timeByCar
str.reverse.foreach { l =>
if (l == 'A') myTime = 3 else myTime -= 2
if (myTime < minTime) minTime = myTime
}
minTime
}
uj5u.com熱心網友回復:
這是一個使用foldLeft
. myTime
我們將在每個字符 (和)之后需要修改的兩個變數存盤minTime
在一個元組中作為累加器。
def findMinTime(str: String, timeByCar: Int): Int = {
val (myTime, minTime) = str.reverse.foldLeft((timeByCar, timeByCar)) {
case ((myTime, minTime), l) =>
val newTime = if (l == 'A') myTime 3 else myTime - 2
(newTime, newTime min minTime)
}
minTime
}
uj5u.com熱心網友回復:
foldLeft
是一種方法,當邏輯簡單明了時很有用。但總的來說,scala 中此類任務的首選工具是(尾)遞回:
`
def findMinTime(str: String, timeByCar: Int) = {
@tailrec
def loop(str: List[Char], minTime: Int, myTime: Int): Int = str match {
case Nil => minTime
case 'A' :: tail => loop(tail, myTime 3, minTime min myTime 3)
case _ :: tail => loop(tail, myTime -2, minTime min myTime-2)
}
loop(str.toList.reverse, timeByCar, timeByCar)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/489614.html