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 |