返回OCaml中元素的索引
x是一个列表,v是列表中的一个元素。需要返回该元素的索引,否则应返回-1 当元素在列表中时,下面的代码可以正常工作,但当未找到时,它不会返回-1 错误是返回OCaml中元素的索引,ocaml,Ocaml,x是一个列表,v是列表中的一个元素。需要返回该元素的索引,否则应返回-1 当元素在列表中时,下面的代码可以正常工作,但当未找到时,它不会返回-1 错误是else,让j=1+索引tv在j中,因为它一直在添加1,当传递空列表时,它会执行total=total-1,从而返回最后一个元素的索引 我是一个新的OCaml学习者,不知道如何解决这个问题 let rec index x v = match x with [] -> -1 | h::t -> if
else,让j=1+索引tv在j
中,因为它一直在添加1,当传递空列表时,它会执行total=total-1
,从而返回最后一个元素的索引
我是一个新的OCaml学习者,不知道如何解决这个问题
let rec index x v =
match x with
[] -> -1
| h::t ->
if h == v then 0
else let j = 1+ index t v in j
首先,你可以直接说
else 1+索引tv
而不是else让j…
其次,正如您所说的,只要列表中确实存在所需的元素,代码的逻辑就没有错误。随着迭代的继续,您基本上会增加1
但是,很难处理元素不在列表中的情况,因为之前的计数不会停止
为了解决这个问题,最好让我们自己来计算,所以如果没有找到但仍然在列表的中间,那么增加计数;如果确实找到,则返回计数;如果未找到并到达末尾,则返回-1,而不是计数
因此,计数必须是递归函数的一个参数
let index v l =
let rec aux c = function
| [] -> None
| h::t ->
if h = v then Some c
else aux (c+1) t
in
aux 0 l
上面的逻辑恰好转换为tailrecursive(您迟早会知道)
p、 在美国,通常使用
h=v
,因为它是值检查h==v
是物理相等检查,通常我们不希望这样 按注释驾驶:永远不要使用带外sentinel值,如-1(ML)。这就是选项
类型的用途。如果您认为有帮助,请将答案标记为正确。提问而不打分=没有人会帮助你未来的问题