检查矩阵是否包含数字

时间:2015-04-09 10:37:27

标签: ocaml

我想检查[[a,b,c] [d,e,f]]类型的矩阵是否包含特定数字。 我无法访问列表中的列表。

let matrix = [[1;2;3]; [4;5;6]];;

let rec contains mat x = match mat with
| [] -> false
| h::t -> if (h=x) then true else contains t x;;

这项工作是在一维列表中进行的,但我只是太多的新手才能让它在二维上工作。

1 个答案:

答案 0 :(得分:3)

首先,您的函数contains在标准库中为List.mem(并非重新实现它以学习OCaml有任何问题。)
此外,if (h=x) then true else contains t x通常写为(h=x) || contains t x


至于你的问题,你需要迭代矩阵的每个子列表(可能代表一行),并检查每行是否包含你要查找的数字:

# let rec mat_contains mat x = match mat with
    | [] -> false
    | row::tl -> contains row x || mat_contains tl x;;
val mat_contains : 'a list list -> 'a -> bool = <fun>

# mat_contains matrix 4;;
- : bool = true

顺便说一句,这里是使用标准库中的函数编写的:

# let mat_contains2 mat x = List.exists (List.mem x) mat;;
val mat_contains2 : 'a list list -> 'a -> bool = <fun>

# mat_contains2 matrix 4;;
- : bool = true