본문 바로가기
자바스크립트 (JavaScript)/이론

[ 함수 ] 재귀 (Recursive)

by Hwanii_ 2023. 12. 10.
728x90

 

//  재귀 (Recursive)

//  하나의 함수에서 그 함수 자기 자신을 다시 내부에서 호출해서 사용 하는 방법 => 재귀 함수

const a = () => {
    console.log('A')
}

a()

//  일반적으로는 함수를 선언하고, 함수를 호출 할 때, 위와 같이 코드를 작성 하면 된다.

//  위와 같이 a() 를 작성 해서 함수를 호출하면서,
//  함수 자기 자신 내부에서 호출이 되도록 코드를 작성해보자.

const b = () => {
    console.log('B')
    b()
}

//  b()

//  위와 같이 코드를 작성 하면, 함수 b를 호출 했으니, 함수 b의 선언부를 가서,
//  console.log('B') 를 출력 하고,
//  다시 함수 b가 호출되므로, console.log('B') 가 무한정 함수가 동작 하게 된다.
//  따라서 필요에 따라 멈출 수 있게 코드를 작성 해야 한다.

let i = 0
const c = () => {
    console.log('C')
    i += 1
    if (i < 4) {
        c()
    }
}

c()

//  마치 자바에서의 while(true) 무한 반복문에 멈출 수 있는 코드를 작성 하는 것과 동일한 개념 이다.

//  암튼 재귀 함수의 개념은 함수 내부에서 자기 자신을 다시 호출 하는 것 !
//  그래서 멈출 수 있는 조건을 꼭 포함 시키기 !

//  다른 예시

const userA = {name: 'A', parent: null}
const userB = {name: 'B', parent: userA}
const userC = {name: 'C', parent: userB}
const userD = {name: 'D', parent: userC}

const getRootUser = user => {   //  매개변수 user에 userA or B or C or D 가 대입 된다.

    if (user.parent) {   //  매개변수로 받은 user 객체의 parent 속성이 참이면 ~
        return getRootUser(user.parent) //  자기 자신의 함수를 다시 호출 ~
    }
    return user
}

console.log(getRootUser(userD)) //  {name : 'A', parent : null}
console.log(getRootUser(userC)) //  {name : 'A', parent : null}
console.log(getRootUser(userB)) //  {name : 'A', parent : null}
console.log(getRootUser(userA)) //  {name : 'A', parent : null}

//  즉, 최종적으로 함수가 종료 되려면 getRootUser() 함수를 return 값으로 호출 하는게 아니라,
//  return 값으로 매개변수로 받은 user 객체의 데이터를 반환 해야 함수가 종료 된다.

//  위의 함수의 상황은 매개변수로 받은 user 객체 데이터의 parent 속성이 false가 될 때 까지
//  계속 자기 자신 함수를 호출 하는 형식 이다.
//  최종적으로, userA 객체 데이터의 parent 속성은 null이므로, false가 되서,
//  return userA가 되고, getRootUser() 함수가 종료 된다.

//  재귀 함수는 무한하게 반복시키면서 특정 조건을 찾을 수 있는 구조 이다.
//  위와 같은 상황에 사용 하면 유용하게 상황을 해결할 수 있다.
반응형

'자바스크립트 (JavaScript) > 이론' 카테고리의 다른 글

[ 함수 ] this  (0) 2023.12.10
[ 함수 ] 호출 스케줄링  (0) 2023.12.10
[ 함수 ] 콜백 (Callback)  (1) 2023.12.09
[ 함수 ] 즉시실행함수 (IIFE)  (0) 2023.11.06
[ 함수 ] 화살표 함수  (2) 2023.11.06