在javascript中关闭多个空调用sum函数

时间:2017-07-18 22:52:16

标签: javascript recursion closures

我在一次采访中遇到了这个问题。我没有得到如何解决这个问题。 问题:编写一个sum函数,它将添加2个数字,但数字可以通过以下方式传递给函数:

  1. sum(3)(4)//答案应为7
  2. sum(3)()(4)//答案应为7
  3. sum(3)()()()()(4)//答案应为b 7
  4. 我可以使用闭包来解决第一个函数,事实上对于第二个函数我也可以检查参数,如果参数长度为零,我可以再次调用sum除了下一个参数。 但是如何使它通用?意味着即使你的第一个参数和最后一个参数都有' N'通话次数&那些可以是空的或参数化的,它应该返回总和。

6 个答案:

答案 0 :(得分:3)

录制视频如何解决:

https://youtu.be/7hnYMIOVEg0

文字回答:

function sum(numberOne) {
    return function innerSum(numberTwo) {
        if (typeof(numberTwo) === 'number') {
            return numberOne + numberTwo;
        }

        return innerSum;
    }
}

输出:

sum(3)(4); => 7
sum(5)()()(10); => 15

基本上,您需要返回内部函数(innerSum)直到收到值 - 然后返回number

您还可以为您的方法选择其他名称,例如_sum()addToFirstNumber()

答案 1 :(得分:1)



    function add (n) {
    var func = function (x) {
        if(typeof x==="undefined"){
           x=0;
        }
        return add (n + x);
    };
    
    func.valueOf = func.toString = function () {
        return n;
    };
    
    return func;
    }
    console.log(+add(1)(2)(3)()()(6));




我已经回答了这个问题Here

但是根据你的问题,我修改了

function add (n) {
var func = function (x) {
    if(typeof x==="undefined"){
       x=0;
    }
    return add (n + x);
};

func.valueOf = func.toString = function () {
    return n;
};

return func;
}
console.log(+add(1)(2)(3)()()(6));

运行那样的代码

console.log(+add(1)(2)(3)()()(6));

答案 2 :(得分:0)

function sum(num1) {
  return function sum2(num2) {
    if(num2 === undefined) {
      return sum2;
    }

    return num1 + num2;
  }
}

console.log(sum(4)()()()(3)); // -> 7

或者在ES6中:

const add = num1 => num2 => num2 === undefined ? add(num1) : num1 + num2;

console.log(add(4)()()()()()(3)); // -> 7

答案 3 :(得分:0)

您始终可以在函数中返回函数:

let a;

function sum(value) {
  if (typeof value !== "number") {
    return sum;
  }

  if (typeof a !== "number") {
    a = value;
    return sum;
  }

  let result = a + value;
  a = null;
  return result;
}

请参阅https://jsfiddle.net/d9tLh11k/1/

答案 4 :(得分:0)

这应该这样做

function sum(num1) {
    if (arguments.length === 0){
        return sum;
    }

    return function innerSum(num2) {
        if (arguments.length > 0){
            return num1 + num2;
        }else{
            return innerSum;
        }

    }
}

答案 5 :(得分:-1)

您可以通过多种方式执行此操作,但大多数情况下您需要命名递归。也就是说,你可以有类似的东西:

sum = start => (...args) => args.length? args[0] + start : sum(start)

但将它写成:

可能看起来更干净
function sum(start) {
   function out(...args) {
       return args.length? start + args[0] : out
   }
   return out;
}