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