Trace the function 'thrice' - 函数抽象
Trace the function 'thrice' - Function abstraction
我在做作业的时候遇到了下面的代码。我可以理解为什么表达式 (thrice(add1))(0)
的计算结果为 4。如果我们定义 f(x) = x + 1
,(thrice(add1))(0)
将被计算为 f(f(f(x)))
,即 ((x+1)+1)+1
。但是,我不太明白为什么 ((thrice(thrice))(add1))(0)
会评估为 27
,而不是 3*3=9
。
//Javascript
function thrice(f) {
return compose(compose(f, f), f);
}
function compose(fun,fun2) {
return function (n) {
return fun(fun2(n));
};
}
function add1(k) {
return k + 1;
}
console.log(((thrice(thrice))(add1))(0)); //27
console.log((thrice(add1))(0)); //3
内部(三次):
thrice(1) returns ---> function (n) { return fun(fun2(n));
外部(三次):
thrice(1) returns ---> function (n) { return fun(fun2(n));
thrice(1) returns ---> function (n) { return fun(fun2(n));
thrice(1) returns ---> function (n) { return fun(fun2(n));
Outer (add1) 将 add1 函数引入作用域。
声明 0 后,add1 将其作为 k 插入。
add1 函数解析。
K 现在是一个。
我们现在回到原来的 () 中。
变量 n 现在等于 1。
function2 或 (fun2) 变为 add1。
然后外'fun'变成add1.
一三次的整return=3.
第一次发生外部三次,内部三次 return 就是三个。
第二次迭代,是三*三。
终于跟上次了,九*三。
我在做作业的时候遇到了下面的代码。我可以理解为什么表达式 (thrice(add1))(0)
的计算结果为 4。如果我们定义 f(x) = x + 1
,(thrice(add1))(0)
将被计算为 f(f(f(x)))
,即 ((x+1)+1)+1
。但是,我不太明白为什么 ((thrice(thrice))(add1))(0)
会评估为 27
,而不是 3*3=9
。
//Javascript
function thrice(f) {
return compose(compose(f, f), f);
}
function compose(fun,fun2) {
return function (n) {
return fun(fun2(n));
};
}
function add1(k) {
return k + 1;
}
console.log(((thrice(thrice))(add1))(0)); //27
console.log((thrice(add1))(0)); //3
内部(三次):
thrice(1) returns ---> function (n) { return fun(fun2(n));
外部(三次):
thrice(1) returns ---> function (n) { return fun(fun2(n));
thrice(1) returns ---> function (n) { return fun(fun2(n));
thrice(1) returns ---> function (n) { return fun(fun2(n));
Outer (add1) 将 add1 函数引入作用域。
声明 0 后,add1 将其作为 k 插入。 add1 函数解析。
K 现在是一个。 我们现在回到原来的 () 中。 变量 n 现在等于 1。
function2 或 (fun2) 变为 add1。
然后外'fun'变成add1.
一三次的整return=3.
第一次发生外部三次,内部三次 return 就是三个。
第二次迭代,是三*三。
终于跟上次了,九*三。