我在尝试解决数组问题时遇到了一些问题。好吧,我有一个这样的整数数组和一个要添加的 block :
var model = [1,2,1,0,1]; var block = 1;
现在我必须给每个元素加 1 一次,结果应该是这样的:
[1,2,1,0,1] + [0,0,0,0,0] = [1,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] = [1,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] = [1,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] = [1,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] = [1,2,1,0,2]
结果应该是一个 5x5 的数组。当我必须添加超过 1 次的迭代时,问题变得更加复杂。
var model = [1,2,1,0,1]; var block = 2;
现在我有了相同的数组,但我必须以这种方式添加 2 个 block :
[1,2,1,0,1] + [0,0,0,0,0] + [0,0,0,0,0] = [1,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] + [0,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] + [0,0,0,0,0] = [1,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] + [0,0,0,0,0] = [1,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] + [0,0,0,0,0] = [1,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] + [0,0,0,0,0] = [1,2,1,0,2]
[1,2,1,0,1] + [0,0,0,0,0] + [1,0,0,0,0] = [2,2,1,0,1]
[1,2,1,0,1] + [1,0,0,0,0] + [1,0,0,0,0] = [3,2,1,0,1]
[1,2,1,0,1] + [0,1,0,0,0] + [1,0,0,0,0] = [2,3,1,0,1]
[1,2,1,0,1] + [0,0,1,0,0] + [1,0,0,0,0] = [2,2,2,0,1]
[1,2,1,0,1] + [0,0,0,1,0] + [1,0,0,0,0] = [2,2,1,1,1]
[1,2,1,0,1] + [0,0,0,0,1] + [1,0,0,0,0] = [2,2,1,0,2]
. . . .
. . . .
. . . .
[1,2,1,0,1] + [0,0,0,1,0] + [0,0,0,0,1] = [1,2,1,1,2]
[1,2,1,0,1] + [0,0,0,0,1] + [0,0,0,0,1] = [1,2,1,0,4]
我有一个解决第一部分的函数,我可以在必须迭代 1 个 block 时完成它。像这样:
function iterateOneBlock(in_array){
n_out_array = [];
for(i=0; i<in_array.length; i++){
tmp_array = in_array;
tmp_array[i]++;
n_out_array[i] = tmp_array;
}
return n_out_array;
}
const myarray = [1,2,1,0,1];
var myarrayofarray = iterateOneBlock(myarray);
console.log(myarrayofarray);
最佳答案
您也可以使用递归函数来完成。 在下面的代码中有 3 个简单的函数,
arsum(ar1,ar2)
计算两个数组ar1
& ar2
getArr(n,i)
返回一个大小为 n
的数组,除了 i
(那是 1
)
iterateNBlock(inArray, block)
是起点
calculate(arrayOfArray, block)
是递归函数。当 block===0
输入数组为结果时。
在您的示例中,当 block 为 1 时,您计算一些数组作为结果,当 block 为 2 时,您对所有这些数组执行与对第一个数组所做的相同的操作。
因此对于 block=n
,您对 block=n-1
时的结果执行相同的操作。
function arsum(ar1, ar2){
let sum = [];
for(let i=0; i<ar1.length; i++){
sum.push(ar1[i]+ar2[i]);
}
return sum;
}
function getArr(n,i){
let ar = new Array(n).fill(0);
if(i>=0 && i<ar.length)
ar[i]=1;
return ar;
}
function calculate(arrayOfArray, block){
if(block===0)return arrayOfArray;
let n = arrayOfArray[0].length;
let next = [];
for(let i=-1; i<n; i++){
let ar = getArr(n, i);
for(let j=0 ; j<arrayOfArray.length; j++){
next.push(arsum(arrayOfArray[j], ar));
}
}
return calculate(next, block-1);
}
function iterateNBlock(inArray, block){
return calculate([inArray], block);
}
我解释的有点费劲,希望能帮到你!!!
关于javascript - 迭代数组并对每个元素求和 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58182391/