一段糟糕透顶的海鸥seagulls程序
鸟群合并conjoin则变成了一个更大的鸟群,繁殖breed则增加了鸟群的数量,增加的数量就是它们繁殖出来的海鸥的数量
//Flock 群
var Flock = function(n){
//海鸥seagulls
this.seagulls = n;
}
//结队conjoin
Flock.prototype.conjoin = function(other) {
this.seagulls += other.seagulls;
return this;
};
//繁殖breed
Flock.prototype.breed = function(other) {
this.seagulls = this.seagulls * other.seagulls;
return this;
}; var flock_a = new Flock(4); //{ seagulls : 4 }
var flock_b = new Flock(2); //{ seagulls : 2 }
var flock_c = new Flock(0); //{ seagulls : 0 } //注意flock_a a群鸟在结对繁殖的过程中不断变化
var result = flock_a.conjoin(flock_c).breed(flock_b).conjoin(flock_a.breed(flock_b)).seagulls;
//运行结果 ==>>32 而不是16
函数式写法对海鸥seagulls程序改写
//鸟群结队conjoin
var conjoin = function(flock_x, flock_y){
return flock_x + flock_y;
}
//鸟群繁殖breed
var breed = function(flock_x, flock_y){
return flock_x * flock_y;
}
//鸟群a
var flock_a = 4;
//鸟群b
var flock_b = 2;
//鸟群c
var flock_c = 0;
var result = conjoin(breed(conjoin(flock_a,flock_c),flock_b), breed(flock_a, flock_b));
console.log(result); //==>16
缺点:函数嵌套conjoin(breed(conjoin(flock_a,flock_c),flock_b), breed(flock_a, flock_b))既长又TMD臭,一眼看不出什么东东来!!!
但仔细一看,函数"conjoin"与"breed"方法无非做了“加法”与“乘法”的运算,将“加法”修改为“add”,“乘法”修改为“multiply”于是有如下代码
//鸟群结队conjoin
var add = function(x, y){
return x + y;
}
//鸟群繁殖breed ['mʌltɪplaɪ]
var multiply = function(x, y){
return x * y;
}
//鸟群a
var flock_a = 4;
//鸟群b
var flock_b = 2;
//鸟群c
var flock_c = 0;
var result = add(multiply(add(flock_a,flock_c),flock_b), multiply(flock_a, flock_b));
console.log(result); //==>16
在改之前,看一些经典数学公式
// 结合律(assosiative)
add(add(x, y), z) == add(x, add(y, z)); // 交换律(commutative)
add(x, y) == add(y, x); // 同一律(identity)
add(x, 0) == x; // 分配律(distributive)
multiply(x, add(y,z)) == add(multiply(x, y), multiply(x, z));
应用上述公式简化海鸥程序
//原始代码
add(multiply(add(flock_a,flock_c),flock_b), multiply(flock_a, flock_b));
//应用同一律 add(flock_a,flock_c) ==>> flock_a
add(multiply(flock_a,flock_b), multiply(flock_a, flock_b));//(a*b)+(a*b) // 分配律(distributive (a*b)+(a*b) <<==>> b* (a+a)
multiply(flock_b, add(flock_a, flock_a))
于是最终代码就很nice了
//鸟群结队conjoin
var add = function(x, y){
return x+ y;
}
//鸟群繁殖breed ['mʌltɪplaɪ]
var multiply = function(x, y){
return x* y;
}
//鸟群a
var flock_a = 4;
//鸟群b
var flock_b = 2;
//鸟群c
var flock_c = 0;
var result = multiply(flock_a, add(flock_b, flock_b));
console.log(result); //==>16
资料来源