这样的事情可能吗?
大家好,
在我的课堂上,我们被告知要使用功能和命令式编程在OCaml中实现二进制搜索树。 我们正在使用Pascal进行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中数据结构和指针的可能性,因为我总是使用递归编程等等。我正在考虑使用多个“let”,if和else,但我不知道如何定义我的数据结构。 非常感谢您的投入。
答案 0 :(得分:1)
根据我的理解,你会有这样的类型:
type key = int
type t = Empty | Node of t * key * t
但是你的添加功能不应该是这样的:
let rec add x t =
match t with
| Empty ->
Node (Empty, x, Empty)
| Node (l, v, r) ->
let c = compare x v in
if c = 0 then t
else if c < 0 then Node (add x l, v, r)
else Node (l, v, add x r)
因为这只是功能性的。
也许您可以将类型更改为:
type t = Empty | Node of t ref * key * t ref
尝试将add
函数调整为此类型。