我正在尝试编写以下代码而不进行递归:
let rec traverse lst =
match lst with
|a::b::t ->
(* Something that return None*)
traverse (b::t)
| _ -> ()
如何以势在必行的方式做到这一点?
答案 0 :(得分:1)
以势在必行的方式:
let traverse li =
let state = ref li in
while !state <> [] do
let x = List.hd !state in
state := List.tl !state;
(* do whatever you want *)
done
如果您需要访问列表的第二个元素,只需使用相应的List.hd
调用即可。但您可能需要先检查列表是否为空。
我认为没有理由这样做,这比递归循环更重,效率更低,灵活性更低。