JS: Triángulo de Pascal

Hoy, un pequeño problema de código Javascript. El siguiente snippet pretende crear un triángulo de Pascal.
Al constructor Triangle se le pasa el número de filas que se quiere generar para la solución.

La función fillRows() llama a fillRow(numRow) una vez por cada fila que se quiere generar.
La función fillRow(numRow) se encarga de poner los números que van en cada posición de cada fila. Para ello usa un Array llamado row donde pone auxiliarmente los valores antes de agregarlos a this.rows.
Estarán de acuerdo conmigo si les digo que el console.log() comentado como log "B" debería devolver lo mismo que el de la línea 5 -log "A"-.
Pero no. Los resultados de cada console.log para new Triangle(2).rows son:

Log "B": [[1], [1, 1]].
Log "A": [[1], undefined].

Es decir, this.rows tiene los valores correctos dentro de la función fillRow(numRow) pero no fuera de ella.

¿Cuál es el problema?¿Es una cuestión de scopes?¿Debería cambiar la línea 3 por this.rows = new Array()?¿Es acaso una variable declarada con var que debió ser declarada con let?


Espero que no me odien demasiado cuando encuentren el problema.



function Triangle(cantRows) {
    this.cantRows = cantRows;
    this.rows = [];
    this.fillRows();
    console.log(this.rows); //log "A"
}

Triangle.prototype.fillRows = function() {
    this.rows.push([1]);
    for (var numRow = 1; numRow < this.cantRows; numRow++) {
        this.rows[numRow] = this.fillRow(numRow);
    }
}

Triangle.prototype.fillRow = function (numRow) {
    var row = [];
    var rowLength = numRow + 1;
    var pastRow = this.rows[numRow - 1];
    for (var i = 0; i < rowLength; i++) {
        if (this.isBorderCell(pastRow, i)) {
            row.push(1);
        } else {
            var newValue = pastRow[i - 1] + pastRow[i];
            row.push(newValue);
        }          
    }
    this.rows.push(row);
    console.log(this.rows); //log B
}

Triangle.prototype.isBorderCell = function (pastRow, i) {
    return (pastRow[i - 1] === undefined || pastRow[i] === undefined);
}

module.exports = Triangle; 
PD: Creo que en este caso no es necesario, pero el próximo día de sol agrego los números de línea al resaltador de sintaxis.

Comentarios

Entradas populares de este blog

Introduccion a x86 ASM - Registros

Fucking Call Back Verification