我有这个功能:
let rec som a b acc =
if a > b then acc else
som (a+1) b (acc+(comb b a));;
我想做的是将 acc 值保存在哈希表中,所以我的第一次尝试是:
let rec som a b acc =
if a > b then acc else
som (a+1) b (acc+(comb b a)) Hashtbl.add a acc;;
但它不起作用......我怎样才能保存这些值?
这是骨架,您可以尝试将代码添加到其中以获得所需的内容。也许会有所帮助。
module Key = struct
type t=int
let compare: t->t->int = fun a b -> (* return -1 if a<b, 0 if a=b,and 1 if a>b *)
let equal = (=)
end
module H=Hashtbl.Make(Key)
let som =
let h = H.create () in
let rec f a b acc =
try H.find h acc
with Not_found ->
let ans = (* your evaluation code *) in
H.add h acc ans;
ans
in
f
首先,我们来看看签名Hashtbl.add
('a, 'b) Hashtbl.t -> 'a -> 'b -> unit = <fun>
该函数的第一个参数是一个哈希表,那么您需要创建一个。为此,请编写let h_table = Hashtbl.create 123456;;
. 并将其放在上下文中,您的添加指令变为HashTbl.add h_table a acc
接下来,您不能在递归调用的同一级别调用此函数。实际上,该函数som
采用三个参数,您将面临以下错误消息,It is applied to too many arguments ...
.
并且当您要跟踪的值时,acc
您需要将其放在递归调用之前。这样做可能会导致您遇到一些困难,然后我在下面添加了提示。
let _ = Printf.printf "a\n" in
let _ = Printf.printf "b\n" in
(1+2)
;;
a
b
- : int = 3