为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2018-08-02 14:24:19
被一道面试题目难到了。有函数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/
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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

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


查看完整回答
反对 回复 2018-08-05
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

这不就是函数柯里化嘛。
最简单的方式是定义一个正常的函数,然后用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));


    查看完整回答
    反对 回复 2018-08-05
    • 2 回答
    • 0 关注
    • 1099 浏览

    添加回答

    举报

    0/150
    提交
    取消
    意见反馈 帮助中心 APP下载
    官方微信