我有这个功能:
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;;
但它不起作用......如何保存值?
答案 0 :(得分:2)
这是骨架,您可以尝试将代码添加到其中以获得所需内容。也许它会有所帮助。
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
答案 1 :(得分:0)
首先,我们来看看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