【发布时间】:2015-03-23 21:23:59
【问题描述】:
我需要创建一个函数 rec assoc (d,k,l),它采用三元组 (d,k,l) 其中 l 是键值对列表 [(k1,v1);(k2,v2 );...] 并找到第一个等于 k 的 ki。如果找到这样的 ki,则返回 vi。否则,返回默认值 d。它需要是尾递归的
这是我制作的函数:
let rec assoc (d,k,l) = match l with
|[]-> d
|(a,b)::t ->
if (a==k) then b
else assoc(d,k,t)
;;
我的逻辑是获取列表 l 的头部,如果列表中元组的第一部分与 k 匹配,我返回元组的第二部分。 如果不是,那么我想在列表的尾部再次调用该函数,以便检查每个元素。如果整个列表被遍历到空列表而没有找到匹配项,我想返回 d。出于某种原因,无论我给它什么列表,它总是返回 d 。这可能是什么原因。
这里应该给出一些示例输出:
# assoc (-1,"jeff",[("sorin",85);("jeff",23);("moose",44)]);;
- : int = 23
# assoc (-1,"bob",[("sorin",85);("jeff",23);("moose",44)("margaret",99)]);;
- : int = -1
我的两个都返回 -1
【问题讨论】:
-
通常情况下,OCaml 程序员不会像您那样传递元组中的所有参数。如
let rec assoc d k = function.
标签: ocaml