FEDev Story

유명(named)함수를 이용한 재귀 본문

Javascript/함수형

유명(named)함수를 이용한 재귀

지구별72 2017. 12. 28. 19:45

유명함수는 재귀를 만드는 데 편리하다. 다음은 깊이를 가진 배열을 펴 주는 flatten 함수다. 재귀, 유명 함수, 괄호없는 즉시 실행 등의 기법이 사용되었다.

function flatten(arr) {
  return function f(arr, new_arr) { // (1)
    arr.forEach(function(v) {
      Array.isArray(v) ? f(v, new_arr) : new_arr.push(v); // (3)
    });
    return new_arr;
  }(arr, []); // (2)
}

flatten([1, [2], [3, 4]]);
// [1, 2, 3, 4]
flatten([1, [2], [[3], 4]]);
// [1, 2, 3, 4]
flatten([1, [[2], [[3], [[4], 5]]]]);
// [1, 2, 3, 4, 5]
  1. flatten 함수가 실행되면 먼저 즉시 실행할 f라는 이름의 유명 함수로 만든다.
  2. 함수 f를 즉시 실행하면서 새로운 배열 객체를 생성하여 넘겨준다.
  3. 루프를 돌면서 배열이 아닐 때만 값을 push하고 배열인 경우에는 f를 다시 실행하여 배열을 펴고 있다.

다음은 유명함수를 사용하지 않은 재귀 기법이다.

function flatten2(arr, new_arr) {
  arr.forEach(function(v) {
    Array.isArray(v) ? flatten2(v, new_arr) : new_arr.push(v); // (3)
  });
  return new_arr;
}
flatten2([1, [2], [3, 4]], []); // 항상 빈 Array를 추가로 넘겨야하는 복잡도 증가
function flatten3(arr, new_arr) {
  if (!new_arr) return flatten3(arr, []); // if 문이 생김
  arr.forEach(function(v) {
    Array.isArray(v) ? flatten3(v, new_arr) : new_arr.push(v); // (3)
  });
  return new_arr;
}
flatten3([1, [2], [3, 4]]); // 사용 부분은 [코드 2-42]과 동일해짐
Comments