先从一个老掉牙的例子开始吧
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++这样正序遍历,以及怎么写循环来获得一个高效的执行效率,那就下次再说了。