javascript - [面试题目]如何实现multi(2)(3)(4)=24?
阿神
阿神 2017-04-10 16:30:38
0
13
1444

被一道面试题目难到了。
有函数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.
所以,上面的方案还是有所欠缺的。

阿神
阿神

闭关修行中......

Antworte allen(13)
小葫芦

currying。撸主可以去查一下~

左手右手慢动作

这道题对于懂得/或者习惯函数式编程的不是事,但是对于一般的命令式/OO程序员一开始还真不容易让绕清楚。

黄舟

看了各位大神的解答后,感觉很受启发。我试着写了一个科里化函数:

var curry = function(func) {
    var that=this;
    var curry_func = function() {
        var this_func = arguments.callee;
        var new_params = this_func.params.slice();
        for(var i=0;i<arguments.length;i++)
            new_params.push(arguments[i]);
        if(new_params.length >= func.length)
            return func.apply(that, new_params);
        else{
            // dirty way to copy function
            eval('var new_func =' + this_func.toString());
            new_func.params = new_params;
            return new_func;
        }
    };
    curry_func.params = [];
    return curry_func;
};

// 原函数
var test_func = function(a, b, c) { return a*b*c; };

var f0 = curry(test_func);

// 实现科里化功能
console.log(f0(2,3,4));
console.log(f0(2)(3)(4));
console.log(f0(2,3)(4));

// 科里化结果不会互相影响
f1 = f0(2,3);
console.log(f1(10));
console.log(f1(11));
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage