我想在OCaml中表示游戏树。当前位置是根,根的子代表一次移动后的一些结果位置,依此类推。我想动态扩展这个游戏树(逐个添加新的可能移动)。
我有一个"位置"类型。我想是天真的方式:
type tree = Nil | Node of position * (tree list);;
但这不允许我通过添加新动作来增加我的树,因为列表不可变。我也考虑过:
type tree = Nil | Node of position * ((tree list) ref);;
但是每次我想扩展一个节点时,我都必须替换整个子树列表,这会导致我认为有很多无用的空间?所以我能想到的唯一方法如下:
type 'a mlist = Empty | Cons of 'a * (('a mlist) ref);;
type tree = Nil | Node of position * ((tree mlist) ref);;
但它似乎非常不优雅,特别是因为我基本上不会使用Empty或Nil,这取决于我编码的方式。
答案 0 :(得分:0)
OCaml中的列表类型是不可变的,所以你不能真正这样做:添加到它的尾部并不是一件容易的事。
你有的可能性是:
答案 1 :(得分:0)
如果您想继续使用纯功能:
制作二叉树类型
type 'a tree = Nil | F of 'a | Node of 'a tree * position * 'a tree;;
该类型本身仍然是静态的,但如果您创建函数以便它们返回一个新树,您只需拥有一个更新函数,它将使您的树保持最新。您将有更多时间添加和查找元素。这里的优点是通过使用二叉树,您可以更快地找到元素。
否则,您将不得不使用哈希表http://caml.inria.fr/pub/docs/manual-ocaml/libref/Hashtbl.html。它们是某种动态数组。您有基本大小和增长参数。只要你保持当前数组的大小没有任何发生,但是当你添加的元素超过当前大小所支持的元素时,hastable会根据增长参数逐渐发展并变大。你必须找到正确的参数,这样你的表不会有太多无用的空间,但不会经常增长。 :)
希望它是完整的帮助