我想在Ocaml中创建一个程序,它将检查另一个矩阵中是否包含一个矩阵

时间:2017-04-02 11:12:14

标签: matrix ocaml

let my_matrix1 = [[1;2];[3;4]];;

let my_matrix2 = [[4;7;8];[3;2;1]];;

我已经定义了两个矩阵,所以我可以看看代码是否正常工作。

我为元素做了这个:

let rec does_it_contain lis x =
if (lis = []) then false
else if ((List.hd lis) = x) then true
else does_it_contain (List.tl lis) x;;

let rec does_it matrix x =
if (matrix = []) then false
else if (does_it_contain (List.hd matrix) x = true) then true
else does_it (List.tl matrix) x;;

does_it my_matrix1 2;;
- bool = true

问题是有效的,但是当我尝试用矩阵(如果一个包含另一个)时,我不确定出了什么问题:

let rec does_it_contain lis1 lis2 =
if (List.hd lis1 = []) then false
else if (List.hd lis1 = lis2) then true
else does_it_contain (List.tl lis1) lis2;;

let rec does_it matrix lis1 =
if (matrix = []) then false
else if (does_it_contain List. hd matrix List.hd lis1 = true) then true
else does_it (List.tl matrix) lis1;;

does_it my_matrix1 my_matrix2;;

请帮忙

1 个答案:

答案 0 :(得分:2)

我认为你必须通过&#34来澄清你的意思;一个矩阵包含在另一个矩阵中#34;。

关于你的代码,我假设矩阵中元素的顺序无关紧要,你只想检查一个矩阵的所有元素是否出现在另一个矩阵中。 你能证实吗?

而且,你并没有真正说出你的问题。编译时错误?不是好结果? 从我看到的,你至少有一个错误,原因是:

does_it_contain List. hd matrix List.hd lis1

您应该在List. hd matrixList.hd lis1附近放置括号,以避免应用于太多参数错误。

让我们以一些编码风格的评论结束:

1)您可以使用List.mem代替在此重新定义:

let rec does_it_contain lis x =
if (lis = []) then false
else if ((List.hd lis) = x) then true
else does_it_contain (List.tl lis) x;;

2)这......

if (does_it_contain List. hd matrix List.hd lis1 = true) then true
else blabla

......风格很差。你可以直接写

does_it_contain (List.hd matrix) (List.hd lis1) || blabla

3)它更喜欢使用模式匹配而不是if (lis = []) then false else if ((List.hd lis) = x) ...。如果您错过某些案例或者您正在编写冗余案例,它会为您静态检查。 首选:

match lis with
| [] -> false
| h::t -> ...

编辑: 使用矩阵是一个适合数组的任务,所以我的方法是将列表转换为数组,然后使用经典的命令方法。 如果你想坚持列表,那么你需要在矩阵中显示找到的子线的索引:如果矩阵A的所有线都出现在矩阵B中,那么 AND 相同的起始指数,则A是B的子矩阵。

您的代码的一个问题是(除了以下不会编译的事实):if (does_it_contain List. hd matrix List.hd lis1 = true) then true

这里,只要矩阵的开头元素与列表中的元素相同,就返回true。你应该在这里检查所有元素,而不仅仅是头部。

  if (does_it_contain (List.hd matrix) (List.hd lis1) = true) then
    does_it (List.tl matrix) lis1
  else false

这使您更接近解决方案,但不会修复您的代码。你应该让索引出现在你的计算中。