2017-04-02 37 views
0
let my_matrix1 = [[1;2];[3;4]];; 

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

我已經定義了兩個矩陣,所以我可以看到代碼是否正常工作。我想在Ocaml中創建一個程序,它將檢查一個矩陣是否包含在另一個矩陣中

我已經做了的元素:

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;; 

請幫

回答

2

我想你必須弄清楚你的「一個矩陣包含在其他基質」的含義是什麼。

關於你的代碼,我假設矩陣中元素的順序並不重要,你只是想檢查一個矩陣的所有元素是否出現在另一個矩陣中。 你能證實嗎?

此外,你並不是真的在說你的問題是什麼。編譯時錯誤?不是好的結果? 從我看到,你至少有一個錯誤是由於:

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中,並且位於相同起始索引處的,則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 

這使您更接近解決方案,但不會修復您的代碼。你應該讓索引出現在你的計算中。

+0

不,你不明白我....我試圖創建一個函數,這兩個矩陣檢查矩陣A是否是矩陣B的子矩陣,如果是,則返回true:val does_it:int list list - > int list list - > bool = Amy24

+0

你應該在描述你的問題時更加清楚。我們仍然不知道你的程序是否編譯。如果確實如此,它的觀察行爲是什麼,以及你在輸入/輸出方面的期望。我編輯了我的答案,給你一些提示。 – ghilesZ

相關問題