2017-04-23 53 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