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;;
请帮忙
答案 0 :(得分:2)
我认为你必须通过&#34来澄清你的意思;一个矩阵包含在另一个矩阵中#34;。
关于你的代码,我假设矩阵中元素的顺序无关紧要,你只想检查一个矩阵的所有元素是否出现在另一个矩阵中。 你能证实吗?
而且,你并没有真正说出你的问题。编译时错误?不是好结果? 从我看到的,你至少有一个错误,原因是:
does_it_contain List. hd matrix List.hd lis1
您应该在List. hd matrix
和List.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
这使您更接近解决方案,但不会修复您的代码。你应该让索引出现在你的计算中。