Я создаю дерево пользовательских объектов в scala, и мой метод insert вызывает переполнение стека, потому что он не является хвостом рекурсивным. Однако я не могу понять, как сделать хвост рекурсивным. Связанные примеры Я видел использование переменных "аккумулятора", но они либо были такими, как целые, которые можно просто умножать и перезаписывать, или списки, с которыми мне трудно адаптироваться к дереву. Вот что у меня есть:
Основа для моих деревьев:
abstract class GeoTree
case object EmptyTree extends GeoTree
case class Node(elem:GeoNode, left:GeoTree, right:GeoTree) extends GeoTree
Метод insert для рекурсивного создания дерева (метод, вызывающий переполнение стека):
def insert(t:GeoTree, v: GeoNode): GeoTree = t match {
case EmptyTree => new Node(v, EmptyTree, EmptyTree)
case Node(elem:GeoNode, left:GeoTree, right:GeoTree) => {
if (v < elem) new Node(elem, insert(left, v), right)
else new Node(elem, left, insert(right, v))
}
}
Я не думаю, что код для GeoNode
действительно особенно важен, потому что он очень прост. Класс имеет два атрибута Long
, а операторы <
, >
и ==
переопределяются для использования внутри дерева. Может ли кто-нибудь сделать предложение о том, как использовать аккумулятор для моей функции insert
или каким-либо другим способом сделать его хвостом рекурсивным?