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
提示:
1 <= inputs.length <= 1000
0 <= inputs[i][j] <= 105
0 <= fn.length <= 1000
inputs.flat().length == fn.length
函数参数需要被显式定义
原站题解
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 */