列表

详情


2632. 柯里化

请你编写一个函数,它接收一个其他的函数,并返回该函数的 柯里化 后的形式。

柯里化 函数的定义是接受与原函数相同数量或更少数量的参数,并返回另一个 柯里化 后的函数或与原函数相同的值。

实际上,当你调用原函数,如 sum(1,2,3) 时,它将调用 柯里化 函数的某个形式,如 csum(1)(2)(3)csum(1)(2,3)csum(1,2)(3),或 csum(1,2,3) 。所有调用 柯里化 函数的方法都应该返回与原始函数相同的值。

 

示例 1:

输入:
fn = function sum(a, b, c) { return a + b + c; }
inputs = [[1],[2],[3]]
输出:6
解释:
执行的代码是:
const curriedSum = curry(fn);
curriedSum(1)(2)(3) === 6;
curriedSum(1)(2)(3) 应该返回像原函数 sum(1, 2, 3) 一样的值。

示例 2:

输入:
fn = function sum(a, b, c) { return a + b + c; }
inputs = [[1,2],[3]]]
输出:6
解释:
curriedSum(1, 2)(3) 应该返回像原函数 sum(1, 2, 3) 一样的值。

示例 3:

输入:
fn = function sum(a, b, c) { return a + b + c; }
inputs = [[],[],[1,2,3]]
输出:6
解释:
你应该能够以任何方式传递参数,包括一次性传递所有参数或完全不传递参数。
curriedSum()()(1, 2, 3) 应该返回像原函数 sum(1, 2, 3) 一样的值。

示例 4:

输入:
fn = function life() { return 42; }
inputs = [[]]
输出:42
解释:
柯里化一个没有接收参数,没做有效操作的函数。
curriedLife() === 42

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板

typescript 解法, 执行用时: 56 ms, 内存消耗: 44.3 MB, 提交时间: 2023-04-17 16:02:30

type F = (...p: any[]) => any

function curry(fn: F): F {
  const n = fn.length
  const args: unknown[] = []

  return function curried(...newArgs: unknown[]) {
    args.push(...newArgs)
    if (args.length < n) {
      return curried
    }
    return fn(...args)
  }
}

/**
 * function sum(a, b) { return a + b; }
 * const csum = curry(sum);
 * csum(1)(2) // 3
 */

javascript 解法, 执行用时: 64 ms, 内存消耗: 43.1 MB, 提交时间: 2023-04-17 16:02:05

/**
 * @param {Function} fn
 * @return {Function}
 */
var curry = function(fn) {
    let argv = [];
    return function curried() {
        argv.push(...arguments);
        if ( argv.length == fn.length ) {
            return fn(...argv);
        } else {
            return curried;
        }
    };
};

/**
 * function sum(a, b) { return a + b; }
 * const csum = curry(sum);
 * csum(1)(2) // 3
 */

javascript 解法, 执行用时: 76 ms, 内存消耗: 43.3 MB, 提交时间: 2023-04-17 16:00:56

/**
 * @param {Function} fn
 * @return {Function}
 */
var curry = function(fn) {
    let argv = [];
    return function curried() {
        for ( let a of arguments ) {
            argv.push(a);
        }
        if ( argv.length == fn.length ) {
            return fn(...argv);
        } else {
            return curried;
        }
    };
};

/**
 * function sum(a, b) { return a + b; }
 * const csum = curry(sum);
 * csum(1)(2) // 3
 */

上一题