座標と値のタプルからその次の対角線上の座標と値のタプルを得る関数を作れば簡単です。あとはIterator#iterateを使うだけです。
// (0, 0, 1) -> (1, -1, 3) -> (-1, -1, 5) -> (-1, 1, 7) def next(s :(Int,Int,Int)) = s match { case (x, y, n) if x > 0 && y < 0 => (-x, y, n + x * 2) case (x, y, n) if x < 0 && y < 0 => (x, -y, n - x * 2) case (x, y, n) if x < 0 => (-x, y, n - x * 2) case (x, y, n) => (x + 1, -y - 1, n + x * 2 + 2) } val N = 1001 val M = N / 2 val it = Iterator.iterate((0, 0, 1))(next) println (it.takeWhile(M >= _._1).map(_._3).sum)