一个递归计算行列式的js类
/**作者:烂柯野人
测试方式:安装node
拷贝代码到记事本中,另存为.js文件,再在同一目录新建一个test.js,写入以下两句
var det = require("./utils/det.js"); //专用于测试代码的js,不再用scheduleJob
det.testDet();
在命令行中用cd跳转到以上两文件所在目录,运行 node test.js
**/
//计算n阶行列式
//传入一个一维数组
//如[1,2,3,4]为二阶行列式
//如[1,2,3,4,5,6,7,8,9]为三阶行列式
class Det {
constructor(detData) {
this.det = detData;
this.l=detData.length;
this.n=Math.sqrt(this.l)
this.isDet =false;
this.result=0;
if(Number.isInteger(this.n)){
this.isDet=true;
this.doDet();
}
}
//解行列式
//计算方法,按第一列展开成各项与其代数余子式之和
doDet=function(){
if(this.n==1){
this.isDet=false;
}
if(this.n==2){
this.result= this.det_2(this.det[0],this.det[1],this.det[2],this.det[3]);
}
if(this.n==3){
this.result= this.det_3(this.det)
}
if(this.n>=4){
this.result=this.det_n(this.det,this.n);
}
}
//二阶
det_2=function(a1,a2,a3,a4){
return a1*a4-a2*a3;
}
//三阶用对角线法则
det_3=function(a){
return a[0]*a[4]*a[8]+a[3]*a[7]*a[2]+a[6]*a[5]*a[1]-a[2]*a[4]*a[6]-a[1]*a[3]*a[8]-a[0]*a[7]*a[5];
}
//n阶,(三阶以上行列式无对角线法则)
det_n=function(det,n){
//n阶行列式按第一列展开成n个n-1阶代数余子式之和
let d=0;
for (let i=0;i<n;i++){
let s=[] //余子式
for(let j=0;j<n*n;j++){
if(j>=i*n && j<(i+1)*n ){
}else{
if(j%n!=0){
s.push(det[j])
}
}
}
let d1=0;
if((n-1)==3){
d1=det[n*i]*Math.pow(-1,i)*this.det_3(s);//代数余子式
}else{
d1=det[n*i]*Math.pow(-1,i)*this.det_n(s,n-1);
}
d=d+d1;
}
return d;
}
getResult=function(){
if(this.isDet){
return this.result;
}else{
return '按行从左到右从上到下连续输入,数字间以英文逗号分隔';
}
}
}
exports.testDet = function(){
console.log('test---------');
//四阶测试,
//var d=[3,2,1,1,0,4,-2,-3,2,3,-2,4,1,5,0,6]; //-297
var d=[0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0];
/*五阶测试,
var d=[1,2,1,0,3,
0,1,3,5,2,
2,3,1,6,2,
1,4,0,2,1,
5,0,4,1,6] //-381*/
/*六阶测试,
var d=[1,2,1,0,3,4,
0,1,3,5,2,6,
2,3,1,6,2,1,
1,4,0,2,1,4,
5,0,4,1,6,2,
3,5,2,3,1,2] //2162*/
// 七阶测试,
/*var d=[1,2,1,0,3,4,2,
0,1,3,5,2,6,4,
2,3,1,6,2,1,0,
1,4,0,2,1,4,5,
5,0,4,1,6,2,3,
3,5,2,3,1,2,6,
1,2,3,4,5,6,1] */ //1906
console.log('七阶测试=',d)
let testDet=new Det(d)
console.log('result=',testDet.getResult())
}


