OCaml - 在哈希表中保存递归函数的值

时间:2013-10-23 12:00:31

标签: function recursion ocaml hashtable

我有这个功能:

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;;

但它不起作用......如何保存值?

2 个答案:

答案 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