查找列表中的项目并返回其索引 - OCaml

时间:2015-07-07 21:48:07

标签: list find ocaml ml memory-consumption

我已经编写了以下函数来查找给定项目" x"在给定的列表中" lst"并且如果找到则返回其索引,否则将返回错误:

exception Failure of string

let rec func x lst c = match lst with
    | [] -> raise(Failure "Not Found")
    | hd::tl -> if (hd=x) then c else func x tl (c+1)


let find x lst = func x lst 0

该功能完全正常,我只是想知道它的内存消耗是多少?内存消耗的含义是否取决于列表的长度?还是O(1)?

如果不是O(1)可以有人请让我知道我应该怎么做才能做到这一点?

谢谢

1 个答案:

答案 0 :(得分:4)

你的函数消耗常量(O(1))空间,因为它是尾递归的。

您可以在OCaml.org上了解尾递归,here

<强>更新

这是一个非尾递归解决方案:

exception Failure of string

let rec find x lst =
    match lst with
    | [] -> raise (Failure "Not Found")
    | h :: t -> if x = h then 0 else 1 + find x t

(我刚注意到PatJ已经解释过这个,对不起: - )

非尾递归解决方案通常更简洁,更优雅。这太糟糕了,但这就是世界有时的方式。