一个公共js的算法f(3)(3),f(3,3)

如题调用f(3,3)或者f(3)(3)的值都等于6,各位有什么好的算法没?

阅读 2.6k
4 个回答

这已经是日经问题了…………

在SF已经问过好多遍的了,关键字:柯里化

f = (function(){
    let value = 0
    function ret () {
        for (let k in arguments) {
            value += arguments[k]
        }
        return ret
    }
    ret.toString = function(){
        return value
    }
    return ret
})()

如果只支持固定两个参数的话,还是比较简单的:

function f(a,b){
  if(b){
    return a+b;
  }else{
    return function(b){
      return a+b;
    }
  }
}
新手上路,请多包涵

使用 lodash 或者 ramda 库:

import _ from 'lodash'

const f = (a,b)=>(a+b)

const curryF = _.curry(f);

console.log(curryF(3)(3))

如果自己实现,大概张这样:

function curry(fx) {
  var arity = fx.length;

  return function f1() {
    var args = Array.prototype.slice.call(arguments, 0);
    if (args.length >= arity) {
      return fx.apply(null, args);
    }
    else {
      var f2 = function f2() {
        var args2 = Array.prototype.slice.call(arguments, 0);
        return f1.apply(null, args.concat(args2)); 
      }
      f2.toString = function() {
        return inspectFn(fx) + inspectArgs(args);
      }
      return f2;
    }
  };
}
推荐问题