У меня есть дерево, представленноерекурсии перечислять бесконечное дерево слева направо
type LazyTree<'T> =
| LazyBranch of 'T * ('T LazyTree list Lazy)
Хочу присвоить номер n
к каждому узлу, считая слева направо.
Более формально
Отредактировано:
Для узла a
, h(a)=0
если a
не имеет детей
Для узла a
с родителем p
, h(a)=h(p+1)
Для узла a
, без родителя, L(a)
- пустой набор.
Для узла a
, который имеет родитель, L(a)
представляет собой набор всех узлов, где для каждого узла, i
пути от корня к ней не содержит a
для узла a
, S(a)
это все элементы из L(a)
, где для каждого элемента i
держит h(i)<=h(a)
мне нужно заменить значение каждого узла a
с размером S(a)
Я не могу найти решение для своей проблемы, которое не связано с побочными эффектами.
Моя функция должна возвращать дерево.
Его узел зависит от узла левого брата. Таким образом, функция должна получить 'T LazyTree Option
в качестве параметра.
Но его самый левый ребенок зависит от нашего самого правого родственника, который зависит от нас. Кажется, у нас есть бесконечный цикл.
Я не спрашиваю, как его решить на конечном дереве.
Я не прошу об абстрактной концепции. Вот как я могу вернуть одно бесконечное дерево от другого:
type LazyTree<'T> =
| LazyBranch of 'T * ('T LazyTree list Lazy)
with
member this.Item = match this with LazyBranch(item,_) -> item
member this.Children = match this with LazyBranch(_,children) -> children
member this.Map func =
let children =
lazy
(
this.Children.Force()
|> List.map (fun child -> child.Map func)
)
LazyBranch(func this.Item, children)
Какие решения у вас возникли и какие у них побочные эффекты? –
Я придумал решение для конечного дерева. Я просто просмотрел его как список, а затем восстановил структуру дерева из этого списка. Там бы не работало. Я не пытался так решить его с побочными эффектами. – user2136963
Если вы голосуете, чтобы закрыть, пожалуйста, сообщите в комментариях, если вы можете его решить, по крайней мере, без решения проблемы. – user2136963