【问题标题】:closure in javascript with multiple empty calls to sum functionjavascript中的闭包,对sum函数有多个空调用
【发布时间】:2017-07-18 22:52:16
【问题描述】:

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

  1. sum(3)(4) // 答案应该是 7
  2. sum(3)()(4)//答案应该是7
  3. sum(3)()()()()(4) //答案应该是 b 7

我可以使用闭包解决第一个函数,实际上对于第二个函数,我也可以检查参数,如果参数长度为零,我可以再次调用 sum 到除了下一个参数。 但是如何使其通用?意味着即使您的第一个参数和最后一个参数也有“N”个调用次数,并且可以为空或参数化,它应该返回总和。

【问题讨论】:

  • 我添加了一个视频,有详细的解释和解决方案。

标签: javascript recursion closures


【解决方案1】:

录制视频如何解决:

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()

【讨论】:

    【解决方案2】:

    你总是可以从一个函数中返回一个函数:

    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/

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

        【解决方案4】:

            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 个参数。
        • 是的,这是通用的,因为它可以接受 n 个参数。干杯:)
        • 如果你需要在它前面加上+,我怀疑它是否能解决问题。问题中没有提到这一点。
        • 我不买。 :D 在记录有问题的值之前没有提到强制转换函数。但是,仍然是很好有趣的解决方案。 :)
        【解决方案5】:

        应该这样做

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

        【讨论】:

          【解决方案6】:

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

          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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-22
            • 1970-01-01
            • 2014-11-15
            相关资源
            最近更新 更多