search

Home  >  Q&A  >  body text

javascript - [面试题目]如何实现multi(2)(3)(4)=24?

被一道面试题目难到了。
有函数multi(2)(3)(4)=24,算法是2X3X4=24。
求解multi函数。

求大神解答~

------------------分割线---------------------
最终采纳了@Ende93 的答案,感觉更优美一些。但是代码需要调整一下:

function multi(n){
  var fn = function(x) {
    return multi(n * x);
  };
  
  fn.toString = function() {
    return n;
  };
  
  return fn;
}

demo: http://jsfiddle.net/etianqq/7sjo4nwt/

------------------分割线---------------------
谢谢 @kikong 的comments,我之前想法是仓促些,之所以demo里面显示为24,是因为dom操作时自动调用了function.toString(),所以显示为数字了。
如果直接console.log(multi(2)(3)(4))--->function... ,如果是console.log(multi(2)(3)(4)+1)--->25.
所以,上面的方案还是有所欠缺的。

阿神阿神2818 days ago1424

reply all(13)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 16:32:38

    首先返回值要是函数,其次要传递值:

    function multi(n){
      var fn = function(x) {
        return multi(n * x);
      };
      
      fn.valueOf = function() {
        return n;
      };
      
      return fn;
    }
    
    multi(1)(2)(3)(4) == 24; // true

    上诉代码来自于:codewar 加法链 Best Practices

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 16:32:38

    这不就是函数柯里化嘛。
    最简单的方式是定义一个正常的函数,然后用lodash或underscore或者其他类似库完成柯里化。方法如下:

    var baseFun = function(a, b, c){
      return a * b * c;
    }
    var multi = _.curry(baseFun);
    console.log(multi(2)(3)(4));

    需要注意的是,柯里化需要指定总参数个数,在lodash中如果未指定则视为this.length,在上例中也就是3.
    柯里化后的函数将在连续调用n次后返回所需的结果,n为刚刚说的参数个数。

    当然,你也可以不用柯里化的方式,直接按对方的逻辑要求用递归简单的实现一下。。

    function multi(v, last, times){
      times = (times || 0) + 1;
      last = (last || 1) * v;
      if(times < 3) {
        return function(v) {
          return multi(v, last, times);
        }
      } else {
        return last;
      }
    }
    console.log(multi(2)(3)(4));

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:32:38

    function curry(fn){
       var value;
       var callback = function(next){
          value = typeof value === "undefined" ? next : fn.apply(null,[value,next]);
          return callback;
       }
       callback.valueOf = callback.toString = function(){
         return value;
       
       }
       return callback
    }
    //加
    function add(x,y){
      return x + y
    }
    //减
    function minus(x,y){
      return x -y
    }
    //乘
    function multiply(x,y){
      return x * y;
    }
    //除
    function pide(x,y){
      return x / y;
    }
    curry(add)(2)(3)(4)(5)(6) //2+3+4+5+6=20
    curry(minus)(2)(3)(4)(5)(6) //2-3-4-5-6=-16
    curry(multiply)(2)(3)(4)(5)(6) //2*3*4*5*6=720
    curry(pide)(2)(3)(4)(5)(6) //2 / 3 / 4/ 5 /6 = 0.00555555...

    reply
    0
  • PHPz

    PHPz2017-04-10 16:32:38

    你指的是这样么?

    var multi = function(num1){
            return function(num2){
                    return function(num3){
                            return num1 * num2 * num3;
                    };
            };
    };

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 16:32:38

    var baseFun = function(a, b, c){
    return a b c;
    }
    var multi = _.curry(baseFun);
    console.log(multi(2)(3)(4));

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 16:32:38

    var multi = x => y => z => x * y * z;
    

    reply
    0
  • 黄舟

    黄舟2017-04-10 16:32:38

    function multi(num){
      return function(secondNum){return function(thirdNum){return num*secondNum*thirdNum}}
    }

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 16:32:38

    函数curry化,提供一个类似的思路:

    函数Curry(柯里)化(部分传参,返回一个已传部分参数的函数;适用于公用一个函数,且传给改函数的部分参数是相同的情况)

    function curry (fn) {
         var slice = Array.prototype.slice,
              old_args = slice.call(arguments, 1);
         return function () {
              var new_args = slice.call(arguments),
                   args = old_args.concat(new_args);
              return fn.apply(null, args);
         }
    }

    var add = function (x, y, z) {
         return x+y+z;
    }

    //一步curry化
    curry(add, 1)(2, 3);     //返回6

    //两步curry化
    var addOne =  curry(add, 1);
    var addTwo = curry(addOne, 2);
    addTwo(3);     //返回6

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:32:38

    实现1:)

    var multi=function(arg0){
        return function(arg1){
            return function(arg2){
                return arg0*arg1*arg2
            }
        }
    };

    实现2:要多调用一次,可能和题目的要求不符,但提供了一种可以更多参数调用的可能,参考下

    var multi=(function(){
    
        var result=1;
        return function __multi__(arg){
            if(!arg){
                return result;
            }
            result=result*arg;
            return __multi__;
        };
    }());
    ···
    console.log(multi(2)(3)(5)());

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 16:32:38

    http://roshanca.com/2012/javascript-tiny-quiz/

    reply
    0
  • Cancelreply