我有一個遞歸函數fact
,它可以從它內部的表達式或其外部的表達式中調用。在OCaml中爲遞歸函數定義一個靜態變量
我想fact
具有可變v
相關聯,使得每次fact
從外(另一功能)調用,v
被初始化,並且其值可以內部fact
被改變,但絕不可時被初始化fact
從內部調用。
下面的代碼適合我的需要,但一個問題是,v
被定義爲一個全局變量,我有叫fact
從外面,我不覺得漂亮之前做v := init
。
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 *)
任何人都可以想到更好的實現嗎?
雖然變量'v'具有比'fact'函數更大的* scope *,我不會將其稱爲* static *。 – huitseeker 2011-12-28 20:24:04
@huitseeker:我想這個術語來自C語言,如果你將一個局部函數變量定義爲* static *,它只會在第一次調用時被初始化,並且在以後的調用中會重複使用相同的值。這通常用於跨函數調用傳播內部信息。(甚至有早期的Fortrans等語言,其中所有的函數變量都是靜態的,也就是說編譯器沒有在棧上動態分配幀的概念,所有的東西都是在編譯時分配的,特別是你不能有兩次調用相同的函數同時存在;沒有遞歸) – gasche 2011-12-28 23:26:19