[面试题目]如何实现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/


largeQ
浏览 1008回答 2
2回答

至尊宝的传说

首先返回值要是函数,其次要传递值: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

慕虎7371278

这不就是函数柯里化嘛。最简单的方式是定义一个正常的函数,然后用lodash或underscore或者其他类似库完成柯里化。方法如下:var&nbsp;baseFun&nbsp;=&nbsp;function(a,&nbsp;b,&nbsp;c){&nbsp;&nbsp;return&nbsp;a&nbsp;*&nbsp;b&nbsp;*&nbsp;c; }var&nbsp;multi&nbsp;=&nbsp;_.curry(baseFun);console.log(multi(2)(3)(4));需要注意的是,柯里化需要指定总参数个数,在lodash中如果未指定则视为this.length,在上例中也就是3.柯里化后的函数将在连续调用n次后返回所需的结果,n为刚刚说的参数个数。当然,你也可以不用柯里化的方式,直接按对方的逻辑要求用递归简单的实现一下。。function multi(v, last, times){&nbsp; times = (times || 0) + 1;&nbsp; last = (last || 1) * v;&nbsp; if(times < 3) {&nbsp; &nbsp; return function(v) {&nbsp; &nbsp; &nbsp; return multi(v, last, times);&nbsp; &nbsp; }&nbsp; } else {&nbsp; &nbsp; return last;&nbsp; }}console.log(multi(2)(3)(4));
打开App,查看更多内容
随时随地看视频慕课网APP