Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 如何递归地将列表中的所有元素与其自身相乘以创建矩阵?奥卡姆_Ocaml - Fatal编程技术网

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]]