簡體   English   中英

迭代數組並對每個元素求和 1

[英]Iterate array and sum 1 to each element

我在嘗試解決 arrays 的問題時遇到了一些問題。 好吧,我有一個這樣的整數數組和一個要添加的塊:

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 個塊:

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

我有一個 function 解決了第一部分,當我必須迭代 1 個塊時我可以做到。 像這樣:

    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);

這是我能做到的最接近你的代碼。 iterateOneBlock基本上就是你的 function。 第一行添加了in_array的副本(通過Array.from )(添加[0, 0, 0, 0, 0]的情況)。 同樣,在循環內部,我們必須再次復制in_array ,以避免一遍又一遍地添加對同一個數組的引用。 下一個 function 編碼每個添加塊基本上乘以結果中的條目數的直覺:如果從 1 開始,對於一個塊(假設長度為 5),您有 6 個條目; 添加另一個塊,每個現有條目都有 6 個條目; 等等。 最后一個 function 只是一個包裝器,因為主力 function 需要一個 arrays 數組,但我們只收到一個數組。

 function iterateOneBlock(in_array) { let out_array = [Array.from(in_array)]; for (let i = 0; i < in_array.length; i++) { let tmp_array = Array.from(in_array); tmp_array[i] += 1; out_array.push(tmp_array); } return out_array; } function iterateMultipleBlocksOnArrayOfArrays(in_array_array, blocks) { let tmp_array_array = []; for (let n = 0; n < blocks; n++) { for (let i = 0; i < in_array_array.length; i++) { tmp_array_array.push(...iterateOneBlock(in_array_array[i])); } in_array_array = tmp_array_array; tmp_array_array = []; } return in_array_array; } function iterateMultipleBlocks(in_array, blocks) { return iterateMultipleBlocksOnArrayOfArrays([in_array], blocks); } console.log(iterateMultipleBlocks([0, 0, 0], 2))

您也可以使用遞歸函數來做到這一點。 在下面的代碼中有 3 個簡單的 function,

arsum(ar1,ar2)計算兩個數組ar1ar2的總和

getArr(n,i)返回一個大小為n的數組,它的所有元素都為零,除了i中的元素(即1

iterateNBlock(inArray, block)是起點

calculate(arrayOfArray, block)是遞歸的 function。 block===0時,輸入數組是結果。

在您的示例中,當塊為 1 時,您計算一些 arrays 作為結果,當塊為 2 時,您對所有這些 arrays 執行您對第一個數組所做的操作。

所以對於block=n你對 when 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);
}

有點難解釋,希望能幫到你!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM