Как вы совмещаете два списка слоев из двух поддеревьев и получаете список слоев дерева педерастов? Предположим, что у вас есть это дерево
a
/\
x y
где x
и y
произвольные деревья, и у них есть свои списки слоев, как [[x00,x01,...],[x10,x11,...],...]
и [[y00,y01,...],[y10,y11,...],...]
соответственно.
Список слоев нового дерева будет [[a],[x00,x01,...]++[y00,y01,...],[x10,x11,...]++[y10,y11,...],...]
. Как эта функция создает его?
Давайте посмотрим на это определение
let rec fold_tree f a t = ...
и посмотреть, какие аргументы мы переходим к fold_tree
в нашем определении levels
.
... in fold_tree aux (fun x -> x) tree []
Итак, первый аргумент, aux
, является своего рода длинной и сложной функции. Мы вернемся к нему позже.
Второй аргумент также является функцией - функцией тождества. Это означает, что fold_tree
также вернет функцию, потому что fold_tree
всегда возвращает тот же тип значения, что и его второй аргумент. Мы будем утверждать, что функция fold_tree
, примененная к этому набору аргументов, принимает список слоев и добавляет к ней слои данного дерева.
Третий аргумент - наше дерево.
Подождите, что является четвертым аргументом? fold_tree
только должно получить дерево? Да, но поскольку он возвращает функцию (см. Выше), эта функция применяется к этому четвертому аргументу, пустой список.
Итак, давайте вернемся к aux
. Эта функция aux
принимает три аргумента. Один из них - это элемент дерева, а два других - это результаты складки поддеревьев, то есть то, что возвращается fold_tree
. В нашем случае эти две вещи являются функциями снова.
So aux
получает элемент дерева и две функции и возвращает еще одну функцию. Какая функция такова?Он берет список слоев и добавляет к нему слои данного дерева. Как это происходит? Он добавляет корень дерева к первому элементу (который является верхним слоем) списка, а затем добавляет слои правого поддерева к хвосту списка (который является всеми слоями под вершиной), вызывая правая функция на нем, а затем добавляет слои левого поддерева к результату, вызывая левую функцию. Или, если входящий список пуст, это просто список слоев заново, применяя вышеуказанный шаг к пустым спискам.
Я понимаю все, кроме последнего абзаца. Я имею в виду, как складывается работа? Что такое fl и fp, когда они стали списками? – qiubit
fl и fp - это функции, а не списки. Это результаты 'fold_tree', применяемые к поддеревьям. Эти функции применяются к списку уровней, а результат - новый список уровней. –
Хорошо, может, я просто задал неправильный вопрос. Я имел в виду, что в 'aux' мы имеем два случая для сопоставления - пустой список и список с некоторыми элементами. Когда есть что-то другое, чем пустой список, данный этой функции? Кроме того, как мы можем представить 'fl' и' fp' на соответствующих «уровнях складывания»? Например, в дереве, которое я разместил, я нахожусь на узле с 4. Как «fl» ищет узел с 8 и как «fp» ищет узел с 9? И когда мы находимся на узле 1, как передается информация между 'fl' и' fp', я имею в виду, как они знают, что они должны «сливаться» [4; 5] [6; 7] в одном списке, для пример? – qiubit