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;;ください。そして、コンテキストに入れると、 add 命令は次のようになりますHashTbl.add h_table a acc

次に、再帰呼び出しと同じレベルでこの関数を呼び出すことはできません。実際、この関数somは 3 つの引数を取るため、次のエラー メッセージが表示されます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 に答える