Ocaml 如何递归地将列表中的所有元素与其自身相乘以创建矩阵?奥卡姆
我需要创建一个权重矩阵,基本上是将列表中的所有元素与其相乘。 例如,如果我的列表是Ocaml 如何递归地将列表中的所有元素与其自身相乘以创建矩阵?奥卡姆,ocaml,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和List.nth,作为参数,我只能传入列表: let rec listMatrix = fun(myList)->... 有
[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和List.nth
,作为参数,我只能传入列表:
let rec listMatrix = fun(myList)->...
有没有办法做到这一点?或者我应该试着找到一些根本不同的方法来解决这个问题?
此外,只允许函数方法,不允许全局变量。递归执行的一种方法如下:
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]]