为OCaml中的递归函数定义静态变量

Sof*_*mur 3 variables recursion ocaml

我有一个递归函数fact,可以从其中的表达式或其外部的表达式调用.

我想fact与一个变量相关联v,这样每次fact外部调用(另一个函数),v初始化,并且其值可以在内部更改fact,但从内部fact调用时永远不能初始化.

以下代码适合我的需要,但有一个问题是v被定义为全局变量,我必须v := initfact从外部调用之前做,我觉得不太好看.

let init = 100
let v = ref init

let rec fact (n: int) : int =
  v := !v + 1;
  if n <= 0 then 1 else n * fact (n - 1)

let rec fib (n: int) : int =
  if n <= 0 then 0 
  else if n = 1 then (v := !v + 50; 1)
  else fib (n-1) + fib (n-2)

let main =
  v := init;
  print_int (fact 3);
  print_int !v; (* 104 is expected *)

  v := init;
  print_int (fib 3);
  print_int !v;; (* 200 is expected *)
Run Code Online (Sandbox Code Playgroud)

谁能想到更好的实施?

Mar*_*bon 5

您可以隐藏包含函数体内的函数和值定义,如下所示:

open Printf

let init = 100

let fact n =
  let rec fact counter n =
    incr counter;
    if n <= 0 then 1 else n * fact counter (n - 1)
  in
  let counter = ref init in
  let result = fact counter n in
  (result, !counter)

let main () =
  let x, count = fact 3 in
  printf "%i\n" x;
  printf "counter: %i\n" count (* 104 is expected *)

let () = main ()
Run Code Online (Sandbox Code Playgroud)