Curried javascript sum函数.

Pow*_*Pow 2 javascript recursion closures

我遇到了这个有趣的问题.编写一个javascript函数,通过对同一函数的多次调用,返回传递给它的所有参数的总和.

以下是可以调用函数的方法 -

sum(1, 2, 3, 4);
sum(1, 2)(3, 4);
sum(1, 2)(3)(4);
sum(1, 2, 3)(4);
sum(1)(2, 3, 4);
Run Code Online (Sandbox Code Playgroud)

上面的所有调用都应该工作并返回10.

这是我到目前为止所写的内容,但它仅适用于前两个函数调用sum(1, 2, 3, 4),sum(1, 2)(3, 4)并且为其余部分调整了床.

const arr = [];

function sum(...args) {
  if (args.length === 4) {
    return args.reduce((acc, curr) => {
      return (acc = acc + curr);
    }, 0);
  } else {
    arr.push(...args);
    return function(...args) {
      arr.push(...args);
      return sum(...arr);
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

有人请帮助我,这让我疯了.

谢谢!

CRi*_*ice 6

你很亲密..bind如果你还没有给出至少四个参数,那么这是一个使用该方法返回捕获第一个参数的函数的绝佳机会.

所以类似于:

function sum(...args) {
  if (args.length >= 4) {
    return args.reduce((acc, curr) => {
      return (acc = acc + curr);
    }, 0);
  } else {
    // Bind the arguments you have to this function, and return it:
    return sum.bind(null, ...args)
  }
}

console.log(sum(1, 2, 3, 4));
console.log(sum(1, 2)(3, 4));
console.log(sum(1, 2)(3)(4));
console.log(sum(1, 2, 3)(4));
console.log(sum(1)(2, 3, 4));
Run Code Online (Sandbox Code Playgroud)

最后,我会改变条件来检查,>= 4以便传递更多不会导致你永远咖喱的情况.