追踪功能'三次' - 功能抽象

时间:2016-08-27 03:39:54

标签: javascript algorithm recursion 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

1 个答案:

答案 0 :(得分:0)

内心(三次):

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。

一次三次返回= 3。

第三次发生外部三次,内部三次返回三次。

它第二次迭代,它是三个*三。

最后一次是9 * 3。