簡體   English   中英

memory 如何在 JavaScript 中使用 arrays 進行遞歸分配

[英]How is memory allocation for recursion with arrays in JavaScript

我想了解,當我將 globalArray 作為參數發送給遞歸 function,並將相同的數組(localArray)分配給 globalArray 時,ZDE9B9ED78D7E2E911DCEEFFEE780ZF2 中的 memory 分配是如何發生的。 我知道每個遞歸都會有它自己的調用堆棧,並且它會有自己的變量副本,但是由於我將 globalArray 傳遞到 function 中,localArray 的副本是否總是存儲為每個調用堆棧中的新數組?

如果我要實現 localArray 作為每個執行上下文的相同 localArray 變量的增量副本,我將如何實現呢?

請查看圖片和代碼片段在此處輸入圖像描述

function testFunction(localArray){
    globalArray = localArray;
    if(itr < 5) {
        globalArray.push(1);
        itr++;
        testFunction(localArray);
    }
}

var globalArray = [1,2,3];

var itr = 0;

testFunction(globalArray);

[稍后添加到這個問題]

但是,如果我稍微修改一下代碼,將 localArray 設置為 null,如果它是一個被引用的值,那么 globalArray 仍然會保存數據。

function testFunction(localArray){
    globalArray = localArray;
    localArray = null;
    if(itr < 5) {
        globalArray.push(1);
        itr++;
        testFunction(globalArray);
}
}

var globalArray = [1,2,3];

var itr = 0;

testFunction(globalArray);

在此處輸入圖像描述

...由於我將 globalArray 傳遞給 function,因此 localArray 的副本是否會始終作為新數組存儲在每個調用堆棧中?

不。正如您問題的評論者指出的那樣, arrays 作為值通過引用傳遞,這意味着globalArray變量表示 memory 中存在該數組的位置。 如果您更改指向數組的變量(即globalArray =... ),您只是在更改該變量。 但是,如果您修改一個數組(例如globalArray.push(...) ),您將更改 memory 中查找該數組的每個變量的內容,無論您使用哪個變量名,或者它存在於堆棧中的什么位置.

如果我要實現 localArray 作為每個執行上下文的相同 localArray 變量的增量副本,我將如何實現呢?

有幾種方法可以做這樣的事情。

例如,您可以在將數組傳遞到下一個遞歸級別之前克隆該數組,但如果您最終遞歸非常深入,這可能會花費大量時間,並且 memory 創建 arrays 並復制您可能永遠不會使用的值。

或者,您可以創建類似於鏈表節點的 memory 結構,而不是使用 arrays 結構,並且每個級別在前一個節點的末尾添加一個節點以作為變量傳遞。 這樣,仍然可以在需要時遍歷調用堆棧中的所有元素,但是您使用的 memory 數量與調用堆棧的深度成正比。

您還可以重用單個全局數組,隨着調用堆棧的深入,您可以將其push ,但是在從每個遞歸級別返回之前pop值:基本上維護一個與調用堆棧平行的有狀態堆棧。

最好的方法可能取決於遞歸算法的細節,以及每個級別實際需要維護的數據量。 根據我的經驗,傳入每個級別的局部參數通常是相對“平坦”的匯總值,例如當前的遞歸depth ,而全局變量是您維護 state 的變量。

暫無
暫無

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

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