본문 바로가기

CS/알고리즘

[JS 알고리즘 - 재귀4] 헬퍼 메소드 재귀

아래 강의를 듣고 내용을 정리한 포스트 입니다.

https://www.udemy.com/course/best-javascript-data-structures/

 

JavaScript (JS) Algorithms and Data Structures Masterclass

정렬, 리스트, 힙 스택을 포함한 12개의 알고리즘과 10개 이상 자료구조 학습으로 기술 면접 완벽하게 대비!

www.udemy.com

헬퍼 메소드 재귀라는 설계 패턴에 대해 알아보겠습니다. 패턴은 재귀 알고리즘을 사용할 유용하게 활용됩니다. 그럼 먼저, 기존의 팩토리얼과 같은 단일 단독 함수에 대해 이해해봅시다.

 

single standalone function 


기존의 팩토리얼 같은 풀이법은 함수 외부에서 호출하면, 팩토리얼은 자체 코드 내의 팩토리얼을 직접 호출합니다. 이를 단일 단독 함수 (single standalone function) 이라고 합니다.

 

helper method recursion


헬퍼 메소드 재귀는 외부 함수와 내부에 존재하는 재귀 함수가 따로 존재하게 됩니다.

메인 외부 함수는 우리가 외부에서 호출할 사용하며, 외부 함수를 통해 내부 함수로 값을 전달할 있습니다. 외부 함수 안에는 다른 함수가 정의되어 있고, 외부 함수가 호출되면 내부 함수가 호출됩니다. 그러면 내부 함수는 재귀적으로 자기 자신을 호출합니다.

이런 패턴은 배열이나 데이터 목록 등을 컴파일 흔히 사용됩니다. 팩토리얼이나 다른 함수를 사용할 때처럼 하나의 값을 계속 곱하는 것도 아니고, 계속 더하거나 빼는 것도 아닙니다.

예를 들어, 어떤 배열에서 모든 홀수 값을 수집하는 작업을 수행한다고 하면, 헬퍼 메소드 재귀를 사용하는 것이 가장 좋습니다.

function collectOddValues(arr){
    
    let result = [];

    function helper(helperInput){
        if(helperInput.length === 0) {
            return;
        }
        
        if(helperInput[0] % 2 !== 0){
            result.push(helperInput[0])
        }
        
        helper(helperInput.slice(1))
    }
    
    helper(arr)

    return result;
}

collectOddValues([1,2,3,4,5,6,7,8,9])

위 코드에서 collectOddValues는 외부 함수이며, 이 함수 내부에 helper라는 재귀 함수가 정의되어 있습니다. helper는 helperInput이라는 인자를 받아서 작업을 수행하고, 결과를 result 배열에 저장합니다.

헬퍼 메소드 재귀 없이 함수 내부의 let 배열에 값을 추가해나간다고 생각해보면, 이 함수가 재귀적으로 호출될때, 매번 수집한 데이터가 초기화 될것입니다. 이 변수를 뜬금없이 밖에다가 배치하는 대신, 헬퍼 메소드 재귀를 사용하여 함수안에서 해결할수 있습니다.

요약하자면, 헬퍼 메소드 재귀는 재귀적이지 않은 외부 함수가 재귀적인 내부 함수를 호출하는 패턴입니다.