Maison  >  Questions et réponses  >  le corps du texte

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.
所以,上面的方案还是有所欠缺的。

阿神阿神2750 Il y a quelques jours1373

répondre à tous(13)je répondrai

  • 高洛峰

    高洛峰2017-04-10 16:32:38

    currying。撸主可以去查一下~

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-10 16:32:38

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

    répondre
    0
  • 黄舟

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

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

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

    répondre
    0
  • Annulerrépondre