2017-04-23 52 views
3

我有我的教授給出的這個功能,我不知道實際發生了什麼。這個移調功能是如何工作的?

這裏是計算一個m-n矩陣的轉置功能:

let rec transpose = function 
| [] -> failwith "cannot transpose a 0-by-n matrix" 
| []::xs -> [] 
| xs -> List.map List.head xs :: transpose (List.map List.tail xs) 

測試功能:

> transpose [[1;2;3];[4;5;6]];; 
    val it : int list list = [[1; 4]; [2; 5]; [3; 6]] 

我明白List.map,遞歸和所有的東西。我只是不明白爲什麼/如何這個功能的作品。任何澄清將不勝感激!謝謝!

回答

5

假設我們有一個3x3矩陣A

let A = 
    [ [1;2;3] 
    [4;5;6] 
    [7;8;9] ] 
= [ R1 
    R2 
    R3 ] 

現在,讓我們來分析一下轉功能。

let rec transpose = function 
| [] -> failwith "cannot transpose a 0-by-n matrix" 
| []::xs -> [] 
| xs -> List.map List.head xs :: transpose (List.map List.tail xs) 

第一2案件趕在事件:

  • 列表是空列表
  • 列表中包含一個空列表,這意味着所有內部名單已處理

代碼[1]

List.map List.head xs 

內部列表映射到它們各自的頭元件

R1.Head ; R2.Head ; R3.Head 
= 1 ; 4 ; 7 
= C1 

代碼[2]

transpose (List.map List.tail xs) 

(recursivly)調換斬殺列表的尾部。 因此,在每次遞歸時,一列被轉換成一行。 使用關鍵字::這些行然後用於構造結果列表。

transpose A 
= C1 :: C2 :: C3 :: [] 
= [ C1 
    C2 
    C3 ] 
= [ [1;4;7] 
    [2;5;8] 
    [3;6;9] ] 
+0

謝謝!這是一個解釋的地方! – name