【发布时间】:2014-03-03 10:52:12
【问题描述】:
我正在尝试使用尾递归和空列表[] 作为accu 来生成两组交集的解决方案:
let rec setintersect list list =
let rec setintersect2 a b c =
match a with
| [] -> (match b with [] -> (setsimplify c) | h::t -> (setsimplify c))
| h1::t1 -> (match b with [] -> (setsimplify c) |h2::t2 -> (if (elementof h1 b) then (setintersect2 t1 b (c@[h1])) else (setintersect2 t1 b c))) in
setintersect2 list list [];;
Elementof 接受“一个 int 和一个列表”,如果 x 是列表的元素,则正确工作以给出 true,否则为 false..
问题来了:
# setintersect [5;2;1] [2;6;9];;
- : int list = [2; 6; 9]
它应该给[2]。
我做错了什么? 我觉得我误解了一些非常简单的事情!
编辑: 感谢您迄今为止的回复。
setsimplify 只是删除重复项。
所以[2,2,3,5,6,6] 变成[2,3,5,6]。经过测试并确保其正常工作。
我也不应该使用 List 库中的任何东西。此外,我必须使用“尾递归”,累加器是我在构建时构建的列表。
这是一个想法:
检查
list1中的头元素,如果它存在于list2中,则使用“list1的尾部,list2,并列出c并添加该元素” . ELSE,然后使用“list1、list2的尾部并列出c(原样)”进行递归。结束条件是
list1或list2为空或两者都为空,返回列表c(原样)。
【问题讨论】:
-
你的
setsimplify函数是什么?
标签: recursion ocaml tail-recursion