有没有一种通过高阶函数“包装”递归函数的方法,使得递归调用也被包装?(例如在每次调用时记录函数参数。)
例如,假设我们有一个叫做
有没有一种方法可以编写一个高阶函数
以下代码不起作用:
例如,假设我们有一个叫做
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
Y(logging("a", sum))([1,2,3])
。你的最后一个语句是多余的。将其复制粘贴到 node.js 中,自己看看吧。 - Aadit M Shah