无法执行递归多维数组



我正在用javascript制作一个递归多维数组。但对于矩阵,我觉得很难。

例如,当我这样做:matrix([2,3,4])时,我希望它将此返回给我:

[ [ [ 0, 1, 2, 3 ] 
, [ 0, 1, 2, 3 ] 
, [ 0, 1, 2, 3 ] 
] 
, [ [ 0, 1, 2, 3 ] 
, [ 0, 1, 2, 3 ] 
, [ 0, 1, 2, 3 ] 
] ] 

输入矩阵的长度必须是维度的数量,数字必须是维度值,具有3D 2x3x4矩阵(高度、宽度和高度(。

代码:

function copyArray(A)
{
var B=[]
for(var i=0;i<A.length;i++)
{
B[i]=A[i]
}
return B
}
function matrix(dims)
{
var I=dims[0]
dims.shift()
var A=[]
A.length=I
for(var i=0;i<I;i++)
{
var dims2=copyArray(dims)
A[i]=matriz(dims)
dims=dims2
}
return A
}

我的代码生成了以下错误:

未捕获范围错误:无效的数组长度(…(

你可以这样做,但应该首先提到:

  1. 数组(length(:创建指定长度的数组
  2. .shift((:从数组中移除第一个元素
  3. dims.length?:查看递归函数是否仍应已执行
  4. dims.slice(0(:克隆传递给函数的数组

function matrix(dims) {  
var arr = Array(dims.shift() || 0);
for(var idx = 0; idx < arr.length; idx++) {
arr[idx] = dims.length ? matrix(dims.slice(0)) : idx;
}
return arr;
}
console.log( matrix([2,3,4]) )
.as-console-wrapper {max-height: 100%!important;top:0}

为此使用递归函数。。。根据维度构建关卡移除你处理过的关卡的索引,然后继续。。。这样做,直到没有更多的维度需要处理。

这是一个如何做到的例子…

const createRange = (FROM, TO) => [...Array(TO - FROM + 1).keys()].map(i => i + FROM);
const createMatrix = (dimensions) => {
const dim = dimensions[0];
const newDimensions = dimensions.slice(1, dimensions.length);

if (!newDimensions.length) return createRange(0, dim - 1);

return [...Array(dim).keys()]
.map(_ => createMatrix(newDimensions));
};
console.log(
createMatrix([2,3,4])
)

使用Array.from((的另一种方法,它内置于映射器中

const matrix = (dims) => (
Array.from({length: dims.shift()}, (_,i) => dims.length ? matrix([...dims]) : i)
)
console.log(matrix ([2,3,4]))

最新更新