2632. 柯里化
2023年9月18日大约 3 分钟
2632. 柯里化
/**
* 请你编写一个函数,它接收一个其他的函数,并返回该函数的 柯里化 后的形式。
* 柯里化 函数的定义是接受与原函数相同数量或更少数量的参数,并返回另一个 柯里化 后的函数或与原函数相同的值。
* 实际上,当你调用原函数,如 sum(1,2,3) 时,它将调用 柯里化 函数的某个形式,如 csum(1)(2)(3), csum(1)(2,3), csum(1,2)(3),或 csum(1,2,3) 。所有调用 柯里化 函数的方法都应该返回与原始函数相同的值。
*/
function curry(fn: Function): Function {
return function curried(...args: any[]): any {
if (args.length >= fn.length) {
return fn(...args);
}
return function (...nextArgs: any[]) {
return curried(...args.concat(nextArgs));
};
};
}柯里化(Currying)是一种关于函数的高阶技术。它不仅被用于 JavaScript,还被用于其他编程语言。
柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)。
柯里化不会调用函数。它只是对函数进行转换。
在参数未收集完成的时候会持续返回函数,直至参数完全收集。才会返回结果;
| 优势 | 概述 |
|---|---|
| 参数复用 | 固定部分参数生成新函数,避免重复逻辑 |
| 延迟执行 | 可以在需要时再调用函数 |
| 可读性提升 | 每次调用的语义更清晰,更接近自然语言 |
| 支持函数组合 | 柯里化是实现函数组合的基础之一 |
题目要点
「2632. 柯里化」本质是对象结构变换问题,核心在于键空间规则、覆盖策略与深浅层处理边界。
思路拆解
- 先定义输入输出契约:哪些字段保留、哪些字段合并、冲突时谁覆盖。
- 区分基本类型、数组、普通对象,避免把不同语义混到同一分支。
- 在递归或遍历中保持结果对象的构造顺序与可预测性。
复杂度分析
- 时间复杂度:与节点总数/键总数成正相关;递归方案还要考虑层级深度。
- 空间复杂度:主要来自结果对象、递归栈与中间映射结构。
边界与测试
null、空对象、空数组、缺失字段。- 同名键冲突、嵌套层级不一致、类型不一致。
- 引用类型是否需要复制、冻结或保持原引用。
工程实践
把“冲突处理规则”写成独立函数(如 merge/resolve),比散落在分支里的临时判断更利于维护。
总结
对象题的稳定做法是先定数据契约,再写转换流程;契约清晰后,代码复杂度和错误率都会显著下降。
