I have a recursive function like below
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;
}
I notice that during execution, at some point down = dfs(row+1, col) will assign a false value to down, but 2 lines below after right = dfs(row, col+1) somehow down becomes true again.
This mutation would make sense to me if down was a non-primitive variable like Array or Object and we were passing it around across recursive calls, however it's just a boolean. Furthermore, changing the problematic line to below fixes the problem. (i.e. down no longer gets re-assigned to true)
let up = true, down = true, left = true, right = true;
Does anyone know why this re-assignment happens here? Thanks!
The following line:
only declares up. down, left, right are assigned from global scope and can get updated by any recursion step since they are not local variables.