Sof*_*mur 3 variables recursion ocaml
我有一个递归函数fact,可以从其中的表达式或其外部的表达式调用.
我想fact与一个变量相关联v,这样每次fact从外部调用(另一个函数),v初始化,并且其值可以在内部更改fact,但从内部fact调用时永远不能初始化.
以下代码适合我的需要,但有一个问题是v被定义为全局变量,我必须v := init在fact从外部调用之前做,我觉得不太好看.
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)
谁能想到更好的实施?
您可以隐藏包含函数体内的函数和值定义,如下所示:
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)