我有一個遞回函式,如下所示
function dfs(row, col) {
if (grid[row][col] === 0) return true;
let result = grid[row][col] === 2;
grid2[row][col] = 0;
let up = down = left = right = true; // <--- problematic line
if (row > 0) up = dfs(row-1, col);
if (row < m-1) down = dfs(row 1, col);
// down === false here
if (col > 0) left = dfs(row, col-1);
// down === false here still
if (col < n-1) right = dfs(row, col 1);
// down === true ??
return up && down && left && right && result;
}
我注意到在執行程序中,在某些時候down = dfs(row 1, col)會為 賦值false,down但是下面的 2 行在right = dfs(row, col 1)某種程度上又down變成true了。
down如果是像 Array 或 Object 這樣的非原始變數,并且我們在遞回呼叫中傳遞它,那么這種突變對我來說是有意義的,但它只是一個布林值。此外,將有問題的行更改為以下可以解決問題。(即down不再被重新分配給true)
let up = true, down = true, left = true, right = true;
有誰知道為什么這里會發生這種重新分配?謝謝!
uj5u.com熱心網友回復:
以下行:
let up = down = left = right = true;
只宣告了。下、左、右是從全域范圍分配的,并且可以通過任何遞回步驟進行更新,因為它們不是區域變數。
uj5u.com熱心網友回復:
該let宣告并沒有像您認為的那樣做。(好吧,我認為你認為它確實如此。)
=in a let(or varor ) 宣告的const作業方式如下:
let a = <expression>;
只宣告了一個變數,a. 您可以在其中使用賦值運算子<expression>,但不會導致宣告任何其他變數。這些變數必須存在于某個封閉范圍內,否則(如果您不在“嚴格”模式下)它們將成為隱式全域變數。
在你的宣告中,
let up = down = left = right = true;
該變數up是唯一宣告的變數。為了得到我認為你想要的,你需要
let up, down, left, right;
up = down = left = right = true;
這將在當前范圍內創建所有四個變數,然后隨后的賦值將使它們全部變為true.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513465.html
上一篇:你能告訴我這個演算法的運行時復雜度是多少嗎?[復制]
下一篇:如何遞回地思考`msort`函式
