function factorial(n) {
if (n <= 1) {
return 1;
} else {
return n * factorial(n-1);
}
}
const factorial = function(n){
if (n <= 1) {
return 1;
} else {
return n * factorial(n-1);
}
}
(function(f){
f(10);
})(function(n){
if (n <= 1) {
return 1;
} else {
return n * factorial(n-1);//太依赖于上下文变量名
}
})
//Uncaught ReferenceError: factorial is not defined(…)
(function(f){
console.log(f(10));
})(function(n){
if (n <= 1) {
return 1;
} else {
return n * arguments.callee(n-1);
}
})
//output: 3628800
((f) => console.log(f(10)))( (n) => n <= 1? 1: arguments.callee(n-1)) //Uncaught ReferenceError: arguments is not defined(…)
// 首先我们定义这样一个可以用作求阶乘的递归函数 const fact = (n) => n<=1?1:n*fact(n-1) console.log(fact(5)) //120 // 既然不让这个函数有名字,我们就先给这个递归方法一个叫做self的代号 // 首先是一个接受这个递归函数作为参数的一个高阶函数 const fact_gen = (self) => (n) => n<=1?1:n*self(n-1) console.log(fact_gen(fact)(5)) //120 // 我们是将递归方法和参数n,都传入递归方法,得到这样一个函数 const fact1 = (self, n) => n<=1?1:n*self(self, n-1) console.log(fact1(fact1, 5)) //120 // 我们将fact1 柯理化,得到fact2 const fact2 = (self) => (n) => n<=1?1:n*self(self)(n-1) console.log(fact2(fact2)(5)) //120 // 惊喜的事发生了,如果我们将self(self)看做一个整体 // 作为参数传入一个新的函数: (g)=> n<= 1? 1: n*g(n-1) const fact3 = (self) => (n) => ((g)=>n <= 1?1:n*g(n-1))(self(self)) console.log(fact3(fact3)(5)) //120 // fact3 还有一个问题是这个新抽离出来的函数,是上下文有关的 // 他依赖于上文的n, 所以我们将n作为新的参数 // 重新构造出这么一个函数: (g) => (m) => m<=1?1:m*g(m-1) const fact4 = (self) => (n) => ((g) => (m) => m<=1?1:m*g(m-1))(self(self))(n) console.log(fact4(fact4)(5)) // 很明显fact4中的(g) => (m) => m<=1?1:m*g(m-1) 就是 fact_gen // 这就很有意思啦,这个fact_gen上下文无关了, 可以作为参数传入了 const weirdFunc = (func_gen) => (self) => (n) => func_gen(self(self))(n) console.log(weirdFunc(fact_gen)(weirdFunc(fact_gen))(5)) //120 // 此时我们就得到了一种Y组合子的形式了 const Y_ = (gen) => (f) => (n)=> gen(f(f))(n) // 构造一个阶乘递归也很easy了 const factorial = Y_(fact_gen) console.log(factorial(factorial)(5)) //120 // 但上面这个factorial并不是我们想要的 // 只是一种fact2,fact3,fact4的形式 // 我们肯定希望这个函数的调用是factorial(5) // 没问题,我们只需要把定义一个 f' = f(f) = (f)=>f(f) // eg. const factorial = fact2(fact2) const Y = gen => n => (f=>f(f))(gen)(n) console.log(Y(fact2)(5)) //120 console.log(Y(fact3)(5)) //120 console.log(Y(fact4)(5)) //120
(f => f(f)) (fact => n => n <= 1 ? 1 : n * fact(fact)(n - 1)) (5) // 120
// fact
fact(10)
// Y
(f => f(f))(fact => n => n <= 1 ? 1 : n * fact(fact)(n - 1))(10)
// Y'
const fix = (f) => f(f)
const ygen = fix(fact2)
ygen(10)
// callee
(function(n) {n<=1?1:n*arguments.callee(n-1)})(10)
fact x 18,604,101 ops/sec ±2.22% (88 runs sampled) Y x 2,799,791 ops/sec ±1.03% (87 runs sampled) Y' x 3,678,654 ops/sec ±1.57% (77 runs sampled) callee x 2,632,864 ops/sec ±0.99% (81 runs sampled)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有