从一个权重算法上看如何利用javascript的与逻辑实现短路机制

先从一个老掉牙的例子开始吧

1,一个数据在[k1,+∞)的部分获得一个m1的权重
2,当数据在[k2,k1)的时候获得一个m2的权重
...
n,当数据在[0,kn]的时候获得一个mn的权重

最简单的方法就是使用if()else()语句来对输入的数据进行区分。类似于这样

function xx(xx){
    var result = '';
    while(xx != 0){
        if (xx >= k1) {
            result += (xx - k1)*m1;
            xx -= k1;
        }
        else if(xx >= k2){
            result += (xx - k2)*m2;
            xx -= k2;
        }
        else if(xx >= k3){
            result += (xx - k3)*m3;
            xx -= k3;
        }
        else{
            result += (xx - kn)*mn;
            xx -= kn;
        }
    }
    return result;
}

这样的写法简单但是低效。如果引入了javascript中的短路机制来解决这个问题的话就会变得非常简单
所谓的短路机制就是下面两种情况

  • false && (anything) 短路计算的结果为false.
  • true || (anything) 短路计算的结果为 true.

利用上面的特性我们可以构建一个遍历输入变量xx所有因子的循环,在当遍历到非kn的数据时,利用短路机制屏蔽掉,当便利到kn的时候我们对数据进行加权并计算返回结果。

var hash = [];
    hash[kn] = mn;
    hash[k3] = m3;
    hash[k2] = m2;
    hash[k1] = m1;

function xx(xx){
    for (var i = xx, result = 0; i >= 0 ; i--) {
        hash[i]&&(
            result += (xx - i)*hash[i],
            xx = i;
            )
    }
    return result;
}

这样做就可以利用了短路特性而精简整个代码的执行效率了。
至于,在用for循环的时候为什么要用i--来倒序遍历而不是使用i++这样正序遍历,以及怎么写循环来获得一个高效的执行效率,那就下次再说了。

你可能感兴趣的:(从一个权重算法上看如何利用javascript的与逻辑实现短路机制)