cari

Rumah  >  Soal Jawab  >  teks badan

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

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

求大神解答~

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

1

2

3

4

5

6

7

8

9

10

11

12

<code>function multi(n){

  var fn = function(x) {

    return multi(n * x);

  };

   

  fn.toString = function() {

    return n;

  };

   

  return fn;

}

</code>

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

阿神阿神2912 hari yang lalu1475

membalas semua(13)saya akan balas

  • 高洛峰

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

    currying。撸主可以去查一下~

    balas
    0
  • ringa_lee

    ringa_lee2017-04-10 16:32:38

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

    balas
    0
  • 黄舟

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

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

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

    balas
    0
  • Batalbalas