簡體   English   中英

為什么在執行遞歸回調時 .foreach 的行為與 for...of 不同?

[英]Why does .foreach behave differently than for...of when executing a recursive callback?

我正在使用鄰接表編寫遞歸深度優先圖遍歷,鄰接表是一個包含頂點作為鍵和每個鍵的鄰居作為值的數組的對象。 輔助函數被遞歸調用以訪問初始頂點的所有鄰居,然后是這些鄰居的所有鄰居,等等。

出於某種原因,使用“for...of”循環遍歷每個鄰居數組無法正常工作。 將在鄰居的鄰居的鄰居上調用助手函數,但是當達到基本情況時,助手函數似乎不會在初始鄰居的其他鄰居上調用,因此您最終死了-永遠達不到的終點。

  function depthFirstRecursiveTraversal(initialVertex) {
    const adjacencyList = {
      A: ['B', 'C'],
      B: ['A', 'D'],
      C: ['A', 'E'],
      D: ['B', 'E', 'F'],
      E: ['C', 'D', 'F'],
      F: ['D', 'E']
    };
    let visited = {};
    let vertexList = [];

    function dfsHelper(v) {
      if (!v) return null;
      vertexList.push(v);
      visited[v] = true;

      // Why does a for-of loop fail here? Recursion fails to reach all vertices
      //for (const neighbor of adjacencyList[v]) {
      //  if (!visited[neighbor]) return dfsHelper(neighbor);
      //}

      // But using forEach instead works!
       adjacencyList[v].forEach(neighbor => {
         if (!visited[neighbor]) return dfsHelper(neighbor);
       });

    }
    dfsHelper(initialVertex);

    return vertexList;
  }

調用 depthFirstRecursiveTraversal(A) 返回 [ 'A', 'B', 'D', 'E', 'C', 'F' ],這是正確的。

但是如果你在 for...of 循環中注釋掉 forEach 和注釋,它會返回 [ 'A', 'B', 'D', 'E', 'C' ] —— 'F' 頂點永遠不會到達。

作為參考,這是圖表的樣子:

         A
       /   \
      B     C
      |     |
      D --- E
       \   /
         F

誰能告訴我為什么 for...of 失敗,但 foreach 有效?

for循環中, return將終止整個dfsHelper函數。 相反,在forEach回調中, return只是終止回調。

返回值在這里無關緊要,並且返回除了引入此錯誤之外沒有任何意義。 最好從兩個版本中刪除return - 如果你這樣做, for..of工作正常:

 function depthFirstRecursiveTraversal(initialVertex) { const adjacencyList = { A: ['B', 'C'], B: ['A', 'D'], C: ['A', 'E'], D: ['B', 'E', 'F'], E: ['C', 'D', 'F'], F: ['D', 'E'] }; let visited = {}; let vertexList = []; function dfsHelper(v) { if (!v) return null; vertexList.push(v); visited[v] = true; for (const neighbor of adjacencyList[v]) { if (!visited[neighbor]) dfsHelper(neighbor); } } dfsHelper(initialVertex); return vertexList; } console.log(depthFirstRecursiveTraversal('A'));

暫無
暫無

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

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