Присваиваний нет? Нету. Var’ов тоже. Значит, функциональненько. Должен сказать, в вашем алгоритме черт ногу сломит — я так до конца и не разобрался как он работает, но что мог переделал. Стало еще более запутанно, но короче.
def canStep(path: List[(Int, Int)], pos: (Int, Int)) =
if (path.length == 0) true
else List((pos._1 - path.head._1).abs, (pos._2 - path.head._2).abs).filter(_ < 3).sum == 3
def getPath(path: List[(Int, Int)], available: List[(Int, Int)]): List[(Int, Int)] =
if (available.size == 0)
path
else
available.filter(canStep(path, _)).foldLeft(List[(Int, Int)]()) {
(found, e) => found match {
case Nil => getPath(e :: path, available.filter(_ != e))
case lst: List[(Int, Int)] => lst
}
}
def generatePositions(side: Int) = for (x <- 0 until side; y <- 0 until side) yield (x, y)
println(getPath(List(), generatePositions(5).toList))