티스토리 뷰

1. helper mehtod recursion

: 재귀적이지 않은 외부 함수가 재귀적인 내부 함수(inner function)을 호출하는 패턴이다. 

  • 헬퍼 함수 혹은 헬퍼 메소드 재귀라고 부른다. 
  • 메인 외부 함수를 개발자가 외부에서 호출한다. 
  • 이 외부 함수를  호출할 때 인자를 내부로 전달해 줄 수 있다. 
  • 그리고 이 외부 함수 내부에는 또 다른 내부 함수가 정의되어 있다. 내부함수는 호출되고 재귀적으로 자기자신을 호출한다. 
  • 문제 해결을 위한 하나의 접근법이다. 

기본 예시

function outer(input) {
  // 배열이나 데이터 목록 같은 걸 컴파일해야 할 때 사용
  // ? 예시로, 어느 배열에서 모든 홀수 값을 수집하는 것과 같은 작업
  let outerScopedaVariable = [];
  function helper(helperInput) {
    helper(helperInput--);
  }
  helper(input);
  return outerScopedaVariable;
}

홀수만 뽑아내는 헬퍼 메소드 재귀 예시

function collectOddValues(arr) {
  // 일종의 결과를 컴파일할 때 흔히 사용되는 패턴
  // 배열이나 데이터 목록 같은 것(혹은 배열과 비슷한 다른 형태의 데이터 구조)
  // ? 예시로, 어느 배열에서 모든 홀수 값을 수집하는 것과 같은 작업
  let result = [];

  function helper(helperInput) {
    // 아래 if절은 종료조건 즉, 중단점
    if (helperInput.length === 0) {
      return;
    }

    if (helperInput[0] % 2 !== 0) {
      result.push(helperInput[0]);
    }
    // slice(1)으로 이미 체킹이 끝난 0번째 요소를 제외 시키고 나머지 배열을 재귀적으로 호출!
    helper(helperInput.slice(1));
  }
  helper(arr);
  return result;
}
console.log(collectOddValues([1, 2, 3, 4, 5]));
// * 출력값: [1,2,3]

2. 홀수 배열만 뽑아내는 다른 접근방법: pure recursion 

  • 외부 함수를 쓰는 helper method recursion보다는 더 까다롭긴 하다. 
  • 코드는 더 짧지만 이해하는게 더 어려울 수 있다. 
function collectObbValuesPureRecursion(arr) {
  let newArr = [];
  if (arr.length === 0) {
    return newArr;
  }
  if (arr[0] & (2 !== 0)) {
    newArr.push(arr[0]);
  }
  newArr = newArr.concat(collectObbValuesPureRecursion(arr.slice(1)));
  return newArr;
}

해설 코드

pure recursion

  • 5를 빈 배열과 합치면 그냥 5 => 그 다음 return newArr
  • pure recursion 보다는 help recursion이 더 직관적이다. 하지만, pure recursion의 코드가 더 짧다.

2-1. pure recursion 사용 tips 

  • 배열을 사용하고 헬퍼 메소드없이 순수 재귀 솔루션을 작성하는 경우, 배열을 복사하는 slice, spread 연산자(e.g....Arr), concat 같은 메소드를 사용할 수 있다. 이러면 배열을 변경할 필요가 없다. 
  • 주의) 문자열을 변경할 수 없음 -> slice나 substring을 사용해 사본(copy)을 만들어야 한다.
  • 객체의 경우, Object.assign 이나 spread 연산자를 사용하는 게 유용하다. 

Array.prototype.concat()

concat() 메서드는 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환

기존 배열을 변경하지 않으며 추가된 새로운 배열을 반환한다. 

concat 예시

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);

console.log(array3);
// Expected output: Array ["a", "b", "c", "d", "e", "f"]

Array.prototype.slice()

slice() 메서드는 어떤 배열의 begin 부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환

원본 배열은 바뀌지 않고 새로운 배열을 반환한다. 

slice 예시 

const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

console.log(animals.slice(2));
// Expected output: Array ["camel", "duck", "elephant"]

console.log(animals.slice(2, 4));
// Expected output: Array ["camel", "duck"]

 

댓글