Ну, вы можете использовать хвостовую рекурсивную петлю (как правило, они более "идиоматичны":
def eval(a: Array[Int]): Int =
if (a.size < 2) 3
else {
@annotation.tailrec
def loop(ret: Int = 0, i: Int = 1): Int =
if (i >= a.size) ret / a.size
else {
val mod3 = (a(i) & 0x3)
if (mod3 == 1) loop(ret + 1, i + 1)
else if (mod3 == 3) loop(ret + 3, i + 1)
else loop(ret, i + 1)
}
loop()
}
Затем вы можете использовать это для инициализации кэшированного значения приоритета:
case class PriorityArray(a: Array[Int]) {
lazy val priority = if (a.size < 2) 3 else {
@annotation.tailrec
def loop(ret: Int = 0, i: Int = 1): Int =
if (i >= a.size) ret / a.size
else {
val mod3 = (a(i) & 0x3)
if (mod3 == 2) loop(ret, i + 1)
else loop(ret + mod3, i + 1)
}
loop()
}
}
Вы также можете заметить, что я удалил избыточный & op и у меня есть только одно условное условие (для случая, когда оно равно 2, а не две проверки для 1 && 3) - это должно иметь некоторый минимальный эффект.
Между предложением 0 __, которое только что пришло, нет большой разницы.