Сделай сам: Сумма весов вложенного списка в Scala – изучение нескольких методов

В этой статье блога мы углубимся в тему суммы весов вложенных списков в Scala. Мы рассмотрим различные методы вычисления весовой суммы вложенного списка, начиная от рекурсивных подходов и заканчивая итеративными решениями. Давайте начнем!

Метод 1: рекурсивный подход
Рекурсивный подход — это простой способ вычисления суммы весов вложенного списка. Вот пример реализации:

def nestedListWeightSum(nestedList: List[Any]): Int = {
  def helper(nestedList: List[Any], depth: Int): Int = {
    nestedList.foldLeft(0) { (sum, element) =>
      element match {
        case x: Int => sum + x * depth
        case list: List[Any] => sum + helper(list, depth + 1)
        case _ => sum
      }
    }
  }
  helper(nestedList, 1)
}

Метод 2: итеративный подход
Если вы предпочитаете итеративное решение, вы можете использовать стек для имитации обхода поиска в глубину (DFS) во вложенном списке. Вот пример реализации:

import scala.collection.mutable.Stack
def nestedListWeightSum(nestedList: List[Any]): Int = {
  var stack = Stack[(List[Any], Int)]((nestedList, 1))
  var sum = 0
  while (stack.nonEmpty) {
    val (currentList, depth) = stack.pop()
    currentList.foreach {
      case x: Int => sum += x * depth
      case list: List[Any] => stack.push((list, depth + 1))
      case _ =>
    }
  }
  sum
}

Метод 3: хвостовая рекурсия
Для больших вложенных списков рекурсивный подход может привести к ошибке переполнения стека. В таких случаях вы можете использовать хвостовую рекурсию для оптимизации решения. Вот пример реализации:

import scala.annotation.tailrec
def nestedListWeightSum(nestedList: List[Any]): Int = {
  @tailrec
  def helper(stack: List[(List[Any], Int)], sum: Int): Int = {
    stack match {
      case Nil => sum
      case (currentList, depth) :: rest =>
        currentList match {
          case x: Int => helper(rest, sum + x * depth)
          case list: List[Any] => helper(list.map((_, depth + 1)) ::: rest, sum)
          case _ => helper(rest, sum)
        }
    }
  }
  helper(List((nestedList, 1)), 0)
}

В этой статье мы рассмотрели три различных метода расчета суммы весов вложенного списка в Scala. Мы рассмотрели рекурсивный подход, итеративное решение с использованием стека и реализацию хвостовой рекурсии. Каждый метод имеет свои преимущества в зависимости от размера и сложности вложенного списка. Поняв эти методы, вы сможете выбрать наиболее подходящий для вашего конкретного случая использования.