我經常需要打破OCaml中循環,至少有兩種方式:打破循環OCaml中
(* by exception *)
try
for i = 0 to 100 do
...
if cond then raise BreakLoop
done;
...
with BreakLoop -> ...
(* by while *)
let cond = ref false in
let i = ref 0 in
while (not !cond) && (i<= 100) do
...
i := !i + 1
done;
if !cond then ...
我最關心的是運行時間的優化,只要程序可以輕鬆閱讀和理解。當有幾個嵌套循環時,while
會使循環變得複雜。
我在互聯網的某個地方看到人們說,在OCaml中拋出和捕捉異常代價很高。任何人都可以證實我是否屬實?
那麼我們有時候應該用while
的方式來使用,有時用exception
的方式呢?
您可能對[this]感興趣(http://caml.inria.fr/mantis/view.php?id=5935)討論。另外請注意,您可以使用異常[Exit](http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Pervasives.html#EXCEPTIONExit),而不是定義自己的。 –
考慮使用尾遞歸:'let rec loop i acc = if i> 100 || cond then acc else loop(i + 1)(f acc)'。但我並不是說「總是這樣做」。 – lukstafi
借調。代碼中有很多不必要的可變性。不要使用循環,只考慮條件滿足時才進行遞歸調用。 –