js解析数学运算公式
时间:2019-06-19 19:30:45
收藏:0
阅读:639
//欧几里得算法 求两个数a、b的最大公约数 function gcd(a,b){ return b===0?a:gcd(b,a%b) } //分数类 分子,分母 class Fraction{ static create(num,den=1) { if(num instanceof Fraction){ return num; }else if(/(-?\d+)\/(\d+)/.test(num)){ return new Fraction(parseInt(RegExp.$1),parseInt(RegExp.$2)) }else{ if(/\.(\d+)/.test(num)){ num=num*Math.pow(10,RegExp.$1.length); den=den*Math.pow(10,RegExp.$1.length); } if(/\.(\d+)/.test(den)){ num=num*Math.pow(10,RegExp.$1.length); den=den*Math.pow(10,RegExp.$1.length); } return new Fraction(num,den) } } constructor(num=0,den=1){ if(den<0){ num=-num; den=-den; } if(den===0){ throw ‘分母不能为0‘ } let g=gcd(Math.abs(num),den) this.num=num/g; this.den=den/g; } //加 add(o){ return new Fraction(this.num*o.den+this.den*o.num,this.den*o.den) } //减 sub(o){ return new Fraction(this.num*o.den-this.den*o.num,this.den*o.den) } //乘 multiply(o){ return new Fraction(this.num*o.num,this.den*o.den); } //除 divide(o){ return new Fraction(this.num*o.den,this.den*o.num); } //小于 lessThan(o){ return this.num*o.den<this.den*o.num; } //等于 equal(o){ return this.num*o.den===this.den*o.num; } toString() { return this.num+‘/‘+this.den; } } //贝叶斯 条件概率公式 // WS W在S中的统计概率 // S S的概率 // H 非S的概率 // WH W在非S中的统计概率 // 例如 总共有4个盒子,红盒子S中白球W的统计概率为WS(5/10),非红盒子H中白球W的统计概率为5/40,红盒子S的概率1/4,非红盒子H的概率3/4,求拿出白球W来自于红盒子S的概率SW? function getBayesPAB({WS,S,WH,H}) { const [WS2,S2,WH2,H2]=[WS,S,WH,H].map(function (str) { return Fraction.create(str); }); const h1=WS2.multiply(S2); const h2=WH2.multiply(H2); return h1.divide(h1.add(h2)); } console.log(getBayesPAB({ WS:‘5/10‘,S:‘1/4‘,WH:‘5/40‘,H:‘3/4‘ }).toString());// 输出 4/7 const exec={ ‘A/B‘({A,B}){ const fA=Fraction.create(A) const fB=Fraction.create(B) return fA.divide(fB); }, ‘A*B‘({A,B}){ const fA=Fraction.create(A) const fB=Fraction.create(B) return fA.multiply(fB); }, ‘A+B‘({A,B}){ const fA=Fraction.create(A) const fB=Fraction.create(B) return fA.add(fB); }, ‘A-B‘({A,B}){ const fA=Fraction.create(A) const fB=Fraction.create(B) return fA.sub(fB); }, } let s="(WS*S)/((WS*S)+WH*H)"; let arr=[] const ns=s.replace(/(\w+)\*(\w+)/gi,function (m,p1,p2) { return `exec["A*B"]({A:${p1},B:${p2})`; }) console.log(ns)
原文:https://www.cnblogs.com/caoke/p/11053253.html
评论(0)