Возможно ли такое?
Всем привет,
в моем классе нам сказали реализовать двоичные деревья поиска в OCaml, используя функциональное и императивное программирование. Мы следуем ADT и реализации на Pascal, процедурном языке, где используются указатели.
Вот как выглядит структура данных:
# Pascal
type
tKey = integer;
tPos = ^tNode;
tNode = record
key : tKey;
left, right : tPos;
end;
tBST = tPosT;
Нам также дали некоторые основные операции BST. Вот пример одного из них, если это может помочь:
# Pascal
procedure add_key(VAR T : tBST; k:tKey);
var new, parent, child : tBST;
begin
createNode(new);
new^.key := k;
new^.left := nil;
new^.right := nil;
if T=nil then
T := new
else begin
parent := nil;
child := T;
while (child <> nil) and (child^.key <> k) do begin
parent := child;
if k < child^.key then
child := child^.left
else
child := child^.right;
end;
if (child = nil) then
if k < parent^.key then
parent^.left := new
else
parent^.right := new;
{ duplicates are ignored }
end;
end;
Вот как выглядит моя функциональная (если это имеет смысл) структура данных:
type key =
Key of int;;
type bst =
Empty
| Node of (key * bst * bst);;
Однако у меня большие проблемы с использованием императивного аспекта OCaml. Я должен сделать его максимально похожим на реализацию Pascal, и я не знаю о возможностях структур данных и указателей в OCaml, так как я всегда программировал с использованием рекурсии и так далее. Я думал об использовании нескольких «пусть», если и еще, но я понятия не имею, как определить свою структуру данных. Был бы признателен за огромный вклад в это.