#javascript #class #recursion #matrix #typeerror
Вопрос:
Я пытаюсь создать матричный класс. Функция cof() не работает, когда я использую ее в качестве метода и показываю эту ошибку.
практика:47 Неперехваченная ошибка типа: Не удается прочитать свойство «cof» неопределенного.
Но когда я использую его внутри метода det() как функцию, он работает идеально. Кто-нибудь может объяснить, почему это происходит?
class Matrix{
constructor(matrix){
this.matrix = matrix
}
cof(matrix = this.matrix, i, j) {
let cofMat = matrix.map(row =>
row.filter((_, colIndex) => j !== colIndex)
)
cofMat.splice(cofMat[i],1)
return cofMat
}
det(matrix = this.matrix) {
let validInput = true;
//input validation
let columnLength = matrix.length;
matrix.forEach((row) =>
row.length === columnLength ? (validInput = true) : (validInput = false)
);
if (!validInput) return "Input a valid n*n matrix";
// determining the matrix using 1st row.
// This function is not working properly as a method
function cof(matrix, i, j) {
let cofMat = matrix.map(row =>
row.filter((_, colIndex) => j !== colIndex)
)
cofMat.splice(cofMat[i],1)
return cofMat
}
function recursiveDeterminantMatrix(matrix) {
if (matrix.length === 2 amp;amp; matrix[0].length === 2) {
let result = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
return resu<
} else {
let answer = 0;
for(let i =0; i< matrix.length; i ) {
let cofactor =
(-1) ** i *
matrix[0][i] *
recursiveDeterminantMatrix(this.cof(matrix, 0, i));
answer = cofactor;
};
return answer;
}
}
return recursiveDeterminantMatrix(matrix);
}
}
let matrix = [[1,2,3],[4,5,6],[7,8,8]];
let mat = new Matrix(matrix).det()
Ответ №1:
Для этого вы можете использовать привязку.
recursiveDeterminantMatrix(this.cof(matrix, 0, i).bind(this));
Комментарии:
1. @sadat-saim вы можете отметить ответ как принятый, нажав на галочку, если это помогло вам 😀
Ответ №2:
Когда recursiveDeterminantMatrix
функция выполняется, this
она не вычисляется для экземпляра класса, потому что это не метод, а просто обычная функция.
Вы можете сохранить экземпляр класса в self
переменной для правильного использования во внутренней функции.
det(matrix = this.matrix) {
const self = this;
// ...
function recursiveDeterminantMatrix(matrix) {
if (matrix.length === 2 amp;amp; matrix[0].length === 2) {
let result = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
return resu<
} else {
let answer = 0;
for(let i =0; i< matrix.length; i ) {
let cofactor =
(-1) ** i *
matrix[0][i] *
recursiveDeterminantMatrix(self.cof(matrix, 0, i));
answer = cofactor;
};
return answer;
}
}
return recursiveDeterminantMatrix(matrix);
}
Для получения дополнительной информации о this
ключевом слове, пожалуйста, ознакомьтесь с документами MDN