如何递归地将列表的所有元素与自身相乘以创建矩阵? OCaml的

时间:2014-02-13 23:51:01

标签: ocaml

我需要创建一个权重矩阵,主要是通过将列表的所有元素与它们自身相乘。 例如,如果我的列表是[1;-1;1;-1],则生成的矩阵将是

[[0;-1;1;-1],
 [-1;0;-1;1],
 [1;-1;0;-1],
 [-1;1;-1;0]]

(对角线填充0,因为节点不应该导致自身)

这将是一块蛋糕,但它必须以递归方式完成,具有以下约束: 只能使用List.hd, List.tl and List.nth,作为参数,我只能传入列表:

let rec listMatrix = fun(myList)->...

有没有办法做到这一点?或者我应该尝试找到一些根本不同的方法来解决这个问题? 此外,只允许使用功能方法,没有全局变量。

1 个答案:

答案 0 :(得分:1)

递归执行此操作的一种方法如下:

let l = [1;-1;1;-1];;

let rec index xs =
  let idx xs i = match xs with
      [] -> []
    | (x::xss) -> (i,x) :: idx xss (i+1)
  in idx xs 0

fst (x,y) = x
snd (x,y) = y

let rec mult xs ys = match xs with
    [] -> []
  | (x::xss) -> (List.map (fun y->if (fst x == fst y) then 0 else (snd y*snd x)) ys) :: (mult xss ys)

let mult0 xs = mult (index xs) (index xs)

代码的作用是,将矢量与自身相乘。向量用数字索引,以便特别处理对角元素。

输出结果为:

# mult0 l;;
- : int list list =
[[0; -1; 1; -1]; [-1; 0; -1; 1]; [1; -1; 0; -1]; [-1; 1; -1; 0]]