I’m having difficulty understanding the logic of this exercise and why we need to move the empty row array from outside the loop to inside the outer loop. I read draber06’s explanation, however it still doesn’t make complete sense to me. Here is what he wrote:
Problem is that row never resets. Arrays and objects act as pointers in JavaScript. When you push row into the matrix array, you are pushing a pointer to row into the matrix array, not a copy of row at that point in time. The next time you change row by pushing a 0 onto it, the row already in the matrix array changes too. That’s because matrix[0] is a pointer to a location in memory, and when you call row.push(0), you are changing that location in memory. Therefore the next time you call matrix[0] it will include all changes you’ve made.
You’ll find that matrix[0] === matrix[1]. Same is true for matrix[2]. They are all three pointers to the same location in memory (row).
To solve this, you want to put your row = [] inside the first for loop. This tells it to make a new row (or a new location in memory) every iteration.
If you want to get your expected outcome of 2 columns, 4 columns, 6 columns, then instead of pushing row to matrix, push row.slice(0). This pushes a copy of row to matrix, meaning that all subsequent changes to row will not affect the copy that you pushed. That is, matrix will not contain a pointer to row, but a pointer to a copy of row at some point in time.
I’d really appreciate if someone could break it down in somewhat different terms to make it more comprehensible to me, or link to an article somewhere that goes into this issue at a slower pace and in perhaps more detail.
This is quite an important topic because I know that later challenges in the intermediate algorithms section will make use of problems similar to this one.
I just analysed the entire process using python tutor and it looks like it went through this 6 times:
for (let j = 0; j < n; j++) {
row.push(0);
}
to produce 6 zeroes. this is mind boggling…im pretty sure it goes through only 2 times because j = 0 and j= 1 is less than 2. once it becomes 2, it wont execute the 3rd time. why? ieah? look at the i condition. it stopped running once it reached 3. can you please explain? im baffled.
what do u mean by outer loop? the loop carrying the i variable? if ur talking about that, then yeah i get that. i get the whole process. but my only problem is, if j resets to 0 after failing the condition and going back to i condition to re-run everything again.
i= 0 produces [0,0]
i = 1 produces [0,0]
i = 2 produces [0,0]
together [0,0],[0,0],[0,0] which were all pushed to an empty array called newArray
so answer >> [ [0,0],[0,0],[0,0] ]
but for this to be possible, j has to reset to 0 every time we fail its condition and iterate i again from the top.
no the above has nothing to do with what im saying. actually the top is gibberish. it was my analysis before using the pythontutor that u gave to me to use. let me re-write another comment and make it clean
When a loop start the first thing that happen is the initialisation of the variable (for (let k = 0; ...), so yeah, when the loop with the j variable starts the j is set to 0 (you can use the tool to see when it happens)
yeah j is set to 0 from the START. but i seen the python tutor. it showed much more than that.
j = 0 >>> push 0 to array: [0]
j = 1 >>> push 0 to array : [0,0]
j = 2 > fails condition/ no execution of its statements
so push [0,0] to newArray, another empty array to form this [ [0,0] ]
so now obviously we need 2 more sub arrays of THIS [0,0] to make it [ [0,0],[0,0],[0,0] ]. correct?
but we do realize J =2 NOW. meaning it would fail its condition and not execute again. meaning, it shouldn’t push any more 0s. so im asking if j is reset to 0 to produce the 2 more sub arrays we want?
But at that point, the i loop do an other iteration (i passes from 0 to 1) and everything inside the outer loop is executed again, so the let j = 0 is executed again