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
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!