是否有某种方式通过高阶函数“包装”递归函数,使递归调用也包装? (例如,在每次调用时将参数记录到函数中)。递归函数的高阶函数?
例如,假设我们有一个函数sum()
,它通过将头添加到尾部的总和来返回数字列表的总和:
function sum(a) {
if (a.length === 0) {
return 0;
} else {
return a[0] + sum(a.slice(1));
}
}
是否有某种方式来写一个高阶函数,logging()
,即采取sum()
功能作为输入,并返回参数输出到sum()
每个递归调用的函数吗?
下不起作用:
function logging(fn) {
return function(a) {
console.log(a);
return fn(a);
}
}
sum2 = logging(sum);
sum2([1, 2, 3]);
实际输出:
[1, 2, 3]
-> 6
预期输出:
[1, 2, 3]
[2, 3]
[3]
[]
-> 6
如果sum()
被改写,以便它可以是这甚至可能用于Y Combinator风格的“递归”?
function sum_core(g) {
return function (a) {
if (a.length === 0) {
return 0;
} else {
return a[0] + g(a.slice(1));
}
};
}
sum = Y(sum_core);
sum([1, 2, 3]);
// -> 6
这没有帮助。对'sum()'的递归调用将调用unwrapped版本。 – mjs