首页 > 试题广场 >

柯里化

[编程题]柯里化
  • 热度指数:40132 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
4、调用 c 之后,返回的结果与调用 fn 的返回值一致
5、fn 的参数依次为函数 a, b, c 的调用参数
示例1

输入

var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);

输出

6
function curryIt(fn) {
 const args = [];
    const length = fn.length;
    return _fn = (rest)=>{
        args.push(rest)
        if(args.length>=length){
            return fn(...args)
        }else{
            return _fn
        }
    }
}
发表于 2021-10-19 00:26:14 回复(0)
function curryIt(fn) {
    return function(arg1){
        this.length = 1
        return function(arg2){
            this.length = 1
            return function(arg3){
                this.length = 1
                return fn.call(this,arg1,arg2,arg3)
            }
        }
    }
}
函数的嵌套调用
发表于 2021-04-01 12:02:39 回复(0)
function curryIt(fn) {
    return function a(_a){
        return function b(_b){
            return function c(_c){
                return fn(_a,_b,_c)
            }
        }
    }
}
发表于 2021-01-18 18:11:47 回复(0)
 function curryIt(fn) {
        let sum = 0;
        return function a(_a) {
            if (a.index === fn.length) {
                const arr = new Array(fn.length).fill(0);
                arr[0] = _a;
                return fn.apply(null, arr) + sum;
            }
            a.index = a.index || 1;
            a.index++;
            sum += _a;
            return a;
        }
    }

发表于 2020-03-14 16:50:04 回复(0)
function curryIt(fn) {
  return function a(ap){
      return function b(bp){
             return function c(cp){
                   return fn(ap,bp,cp);
                                 }
                           }
                        }
                     }

 function fun(a,b,c){ return a+b+c; }

 var fun1=curryIt(fun);        //返回的是a函数体
 var fun2=fun1(1);            //返回的是b函数体
 var fun3=fun2(2);             //返回的是c函数体
 console.log(fun3(3));                      //输出结果是1+2+3=6
//这样或许更容易理解一些,亲自运行一下,查看控制台的输出就更容易明白了

编辑于 2018-12-21 17:21:07 回复(0)
function curryIt(fn) {
var len = fn.length;
var arg = [];
var result = function (a) {
len--
arg.push(a)
if (len === 0) return fn.apply(null, arg)
return result
}
return function (num) {
return result(num)
}
}
这个题考到的闭包的用法以及递归

发表于 2018-07-18 15:17:24 回复(0)
function curryIt(fn) {
    return function(a){
        return function(b){
            return function(c){
                return fn(a,b,c);
            }
        }
    }
}

发表于 2018-07-05 16:00:27 回复(0)