如何玩转闭包和柯里化
发布于 9小时前 作者 tulayang 107 次浏览 最后一次编辑是 7小时前 来自 分享

⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈

♆ 两个经典算法:迭代和缓存。读码即知一二。 ⚈ 测试请使用 nodejs v0.12.1 $ node --harmony表达简单,专注算法,这就是我喜欢javascript并将其转为主语言之一,并确信Atwood定律有其道理的原因。

Any application that can be written in JavaScript, will eventually be written in JavaScript.

最小功效原则 The Rule of Least Power: “在过去的40年中,计算机科学一直在开发尽可能功能强大的语言。现在我们必须领会这样的道理:要选择功能最不强的解决方案而不是最强的。语言的功效越小,对于储存在该语言中的数据你能做的事情就越多。如果你把程序写成简单的描述性形式,任何人都可以编写一个程序来分析它。比如,如果一个包含了天气数据的网页,里面使用RDF 格式来描述这些数据,用户就可以把它当做一个表格来查找,也许求它的平均值,或者用它绘图,或把它和其他信息结合在一起进行推理分析。另一个极端情况是,这些天气信息是用漂亮的Java applet描绘出来的。虽然这样可能做出很酷的用户界面,但它完全无法用于分析。找到这个页面的搜索引擎会压根不知道这些数据是什么或者是干什么用的。唯一能发现Java applet的含义的方式就是让它在一个人面前运行起来。” --- 互联网之父Tim Berners-Lee

¶ 求一个序列的偶数平方,返回结果序列

¿ 官方版本:

[1,2,3,4,5,6].filter(x => x % 2 === 0).map(x => x*x);
// [ 4, 16, 36 ]

¿ 非官方版本:

evall([1,2,3,4,5,6])(x => x % 2 === 0)(x => x*x);
// [ 4, 16, 36 ]
        
function evall(sets) {
    return function (ff) {
        return function (ef) {
            var i = -1, len = sets.length, result = [];
            while (++i < len) {
                if (ff(sets[i])) {
                    result.push(ef(sets[i]));
                } 
            }
            return result;
        };
    };
}

¶ 缓存阶乘序列


// 缓存
function memorize(sets, f) {
    var cache = {}; 
    return function (x) { 
        console.log('cache: %j', cache);
        return x in cache
               ? cache[x]
               : cache[x] = f(x);
    }
}

// 阶乘
function factorial(x, total) {
    return x <= 1 ? total : factorial(x-1, x * total);
}

var f = memorize([1,2,3,4,5,6,7,8,9], (x) => factorial(x, 1));

f(1);  // cache: {}
f(2);  // cache: {"1":1}
f(3);  // cache: {"1":1,"2":2}
f(3);  // cache: {"1":1,"2":2,"3":6}
f(3);  // cache: {"1":1,"2":2,"3":6}
f(6);  // cache: {"1":1,"2":2,"3":6}
f(6);  // cache: {"1":1,"2":2,"3":6,"6":720}
f(6);  // cache: {"1":1,"2":2,"3":6,"6":720}

⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚈⚉

回到顶部