2

我有这个功能:

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

但它不起作用......我怎样才能保存这些值?

4

2 回答 2

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
于 2013-10-23T12:15:08.927 回答
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
于 2013-10-23T14:01:56.857 回答