Эффективно вычисляйте значение треугольника Паскаля с помощью мемоизации и рекурсии (обновлено)

Последующие действия для эффективного вычисления значения треугольника Паскаля с использованием мемоизации и рекурсии

На основе отзывов, предоставленных 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 мс. Доволен эффективностью, но мы будем рады получить больше отзывов.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *