优化Switch语句/ While循环

时间:2014-02-25 17:00:12

标签: javascript

我的函数接收f,这是以下形式的另一个函数:

// function f
mgf:function(p,n){
    return function(t){
        return Math.pow(1-p+p*Math.exp(t),n);
    };
}

包含数字pn。然后,它会根据此f函数生成不同的函数,并根据h生成变量值xo(订单1234)并运行while循环,直到v1v2基本相等,然后最终返回此值:

derivative:function(f,o,x){
    var h=0.01,v1,v2;
    switch(o){
        case 1:
            while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
                v1=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
                h-=h/2;
                v2=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
            }
            return v2;
        case 2:
            while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
                v1=(-f(x+2*h)+16*f(x+h)-30*f(x)+16*f(x-h)-f(x-2*h))/(12*Math.pow(h,2));
                h-=h/2;
                v2=(-f(x+2*h)+16*f(x+h)-30*f(x)+16*f(x-h)-f(x-2*h))/(12*Math.pow(h,2));
            }
            return v2;
        case 3:
            while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
                v1=(f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*Math.pow(h,3));
                h-=h/2;
                v2=(f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*Math.pow(h,3));
            }
            return v2;
        case 4:
            while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
                v1=(f(x+2*h)-4*f(x+h)+6*f(x)-4*f(x-h)+f(x-2*h))/Math.pow(h,4);
                h-=h/2;
                v2=(f(x+2*h)-4*f(x+h)+6*f(x)-4*f(x-h)+f(x-2*h))/Math.pow(h,4);
            }
            return v2;
    }
}

正如您所看到的,此代码非常庞大且重复。每个案例执行完全相同的功能,但具有原始f功能的不同功能。如何优化此代码并将其重写为更具可读性?我可以提取一般算法:

while(x) {
    v1=y;
    h-=h/2;
    v2=y;
}
return v2;

并以某种方式有一个参数,它是f的函数? IE浏览器。 (-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h)

1 个答案:

答案 0 :(得分:0)

根据epascarello的评论,解决方案很简单:

derivative:function(f,o,x){
    var h=0.01,v1,v2,f1;
    switch(o){
        case 1:
            f1=function(x,h){ return (-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h); };
            break;
        case 2:
            f1=function(x,h){ return (-f(x+2*h)+16*f(x+h)-30*f(x)+16*f(x-h)-f(x-2*h))/(12*Math.pow(h,2)); };
            break;
        case 3:
            f1=function(x,h){ return (f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*Math.pow(h,3)); };
            break;
        case 4:
            f1=function(x,h){ return (f(x+2*h)-4*f(x+h)+6*f(x)-4*f(x-h)+f(x-2*h))/Math.pow(h,4); };
            break;
    }
    while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
        v1=f1(x,h);
        h-=h/2;
        v2=f1(x,h);
    }
    return v2;
}