Последующие действия для эффективного вычисления значения треугольника Паскаля с использованием мемоизации и рекурсии
На основе отзывов, предоставленных jvwh в ответах
def pascal(c: Int, r: Int): Int = {
if (c < 0 || r < 0 || c > r) throw new IllegalArgumentException()
// use a cache; map (c,r) pair to value
// fill in value recursively
val cache: mutable.Map[(Int, Int), Int] =
(0 to r).flatMap(n => Seq((0, n) -> 1, (n, n) -> 1))
.to(collection.mutable.Map)
def getPascalValue(c: Int, r: Int): Int =
cache.getOrElseUpdate((c,r), getPascalValue(c, r-1) +
getPascalValue(c-1, r-1))
getPascalValue(c,r)
}
Добавляет очевидную обработку инвариантов, метод flatMap для заполнения краев значениями 1 вместо цикла for. Ключевое отличие состоит в том, что он использует изменяемую карту, которая сохраняет предыдущие значения. Время работы для pascal(5, 105) упал с 20 до 3 мс. Доволен эффективностью, но мы будем рады получить больше отзывов.
