【发布时间】:2014-03-27 19:53:00
【问题描述】:
我写了一个递归版本的index如下
let index list value =
let rec counter num = function
| [] -> -1
| h::t ->
if h == value
then num
else (counter (num + 1)) t
in counter 0 list;;
它有效,但后来我们的教授说我们应该使用尾递归版本以便在服务器上不超时,所以我使用 fold 编写了一个新的索引函数,但我似乎无法弄清楚为什么如果它没有'找不到元素,它返回一个大于列表长度的数字,即使我希望它返回 -1。
let index2 list value = fold (fun i v ->
if i > (length list) then -1
else if v == value then i
else i+1) 0 list;;
这也是我的折叠版本:
let rec fold f a l = match l with
[] -> a
| (h::t) -> fold f (f a h) t;;
【问题讨论】:
-
==是物理上的平等(这对整数来说很好),但你可能想要=。 -
您对
index的实现是尾递归的。
标签: functional-programming ocaml fold higher-order-functions