我需要创建一个权重矩阵,主要是通过将列表的所有元素与它们自身相乘。
例如,如果我的列表是[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)->...
有没有办法做到这一点?或者我应该尝试找到一些根本不同的方法来解决这个问题? 此外,只允许使用功能方法,没有全局变量。
答案 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]]