Currying

Currying - Explanation

어려움 함수 O(n) O(n)

Problem Summary

Write a curry function that transforms a function into its curried form.

Go to Problem →

Detailed Explanation

이 문제는 **커링(currying)** 패턴을 학습합니다. 함수형 프로그래밍의 핵심 기법 중 하나입니다. **커링이란?** 여러 인수를 받는 함수를 하나씩 인수를 받는 함수들의 체인으로 변환하는 것입니다: `f(a, b, c)` → `f(a)(b)(c)` **동작 원리** 1. 현재까지 받은 인수 개수와 필요한 인수 개수 비교 2. 충분하면 원본 함수 실행 3. 부족하면 더 많은 인수를 받는 새 함수 반환 **curry((a, b, c) => a + b + c)(1)(2)(3) 실행** 1. curried(1): args=[1], 필요 3개 → 함수 반환 2. 반환된 함수(2): args=[1,2], 필요 3개 → 함수 반환 3. 반환된 함수(3): args=[1,2,3], 필요 3개 → 실행! 결과: 6 **fn.length** 함수의 매개변수 개수를 반환합니다: `((a, b, c) => {}).length` → 3 **커링의 장점** ```javascript const add = curry((a, b, c) => a + b + c); const add5 = add(5); // 첫 인수 고정 const add5and10 = add5(10); // 두 번째 인수도 고정 add5and10(3); // 18 ``` **부분 적용과의 차이** 커링은 항상 하나의 인수를 받지만, 이 구현은 여러 인수를 한 번에 받을 수도 있습니다 (유연한 커링).

Solution Code

solution.js
function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    }
    return (...more) => curried(...args, ...more);
  };
}

Key Concepts from This Problem

1. 커링 패턴
2. fn.length 속성
3. 재귀적 함수 반환
4. 부분 적용

Common Mistakes

fn.length는 기본값이 있는 매개변수는 세지 않습니다
rest 파라미터(...)가 있으면 length가 정확하지 않을 수 있습니다
args를 누적하지 않고 덮어쓰면 이전 인수가 사라집니다

Hints

Hint 1: fn.length로 매개변수 개수를 확인하세요.
Hint 2: 재귀적으로 함수를 반환하세요.

Complexity Analysis

Time Complexity

O(n)

Grows linearly with input size

Space Complexity

O(n)

Uses memory proportional to input size

Related Tags

#함수 #커링 #고차함수