一道函数有关柯里化的面试题

56 阅读1分钟

面试官:需要写一个函数curryAdd,实现数字相加,例如curryAdd(1)(2)(3)()、curryAdd(1,2)(3)()、curryAdd(1,2,3)(),得到的答案都是6,有参数则直接相加,没有参数返回计算结果

一看就知道往函数柯里化方向去想,然后想了好久,硬是没想出来,因为我印象中的函数柯里化都是像防抖节流那样,最多俩括号。

这题必须柯里化结合递归来实现

答案

function curryAdd(...params) {
  const sum = params.reduce((pre, cur) => pre + cur, 0)
  return function(...nextParams) {
     if (nextParams.length === 0) {
      return sum
     }
     return curryAdd(sum, ...nextParams)
  }
}