티스토리 뷰
안녕하세요 재귀함수를 실제 사례에서 사용되어지는 예제를 가지고 이야기해보도록 하겠습니다.
함수 안에서 자신의 함수를 호출할 때 재귀함수라고 부릅니다.
그렇다면 QnA 예시를 통해 재귀함수에 대해서 살펴 봅시다.
QnA 구조
| id | group | depth | writer | title | desc | created_at | updated_at |
이렇게 QnA 구조를 설정했을 때 group과 depth 필드는 다음과 같습니다.
group 필드는 질문 하나와 그 질문에 달린 답변들이 하나의 group이고
depth는 질문이 depth 0을 기준으로 그 아래 달린 답변들 순서대로 depth 1씩 증가합니다.

재귀함수를 사용하여 QnA 데이터 return하기
QnA구조에서 group 별로 depth가 0을 기준으로 하여 depth 0 객체 안에 depth가 1인 children을 넣어주고 depth가 1인 object 안에 다시 depth가 2인 chilren을 넣어주는 식으로 작성해보겠습니다.
1. depth가 0인 데이터들을 다 찾는다.
2. rootQnA값들을 각각 함수를 사용하여 chilren 값들을 넣어준다.
//1. depth가 0인 QnA들을 다 찾는다.
const rootQnA = await this.prisma.$queryRaw<qna[]>`
SELECT * FROM qna WHERE qna.depth = 0
`
//2. rootQnA값들을 각각 함수를 사용하여 chilren 값들을 넣어준다.
const parent: ResponseSearchQnAData[] = []
for (let i = 0; i < rootQnA.length; i++) {
const chilren = await this.searchChildQna(1, rootQnA[i])
parent.push(chilren)
}
rootQnA의 chilren값들을 찾는 함수는 다음과 같습니다.
1. 각 group의 maxDepthNum을 찾는다.
2. 부모값의 depth+1이 chilren이므로 같은 그룹의 chilren 값을 찾는다.
3. chilrend 값을 찾은 후 부모 값에 child key값에 chilren 값을 넣어준다.
4. children의 depth +1 만큼 재귀함수를 maxDepthNum까지 사용한다.
5. maxDepthNum까지 함수를 돌렸으면 값을 return한다.
async searchChildQna(depthVar: number, parent: qna & any): Promise<ResponseSearchQnAData> {
//1. 각 group의 maxDepthNum을 찾는다.
const {_max: { depth: maxDepthNum }}
= await this.prisma.qna.aggregate({
_max: {
depth: true,
},
where: {
bgroup: parent.group,
},
})
let child: dl_qna | null
//2. 부모값의 depth+1이 chilren이므로 같은 그룹의 chilrend 값을 찾는다.
//3. chilrend 값을 찾은 후 부모 값에 child key값에 chilren 값을 넣어준다.
//4. children의 depth +1 만큼 재귀함수를 depth가 maxDepthNum까지 사용한다.
//5. maxDepthNum까지 함수를 돌렸으면 값을 return한다.
if (depthVar <= depthMaxNum) {
const child = await this.prisma.qna.findFirst({
where: {
depth: depthVar,
bgroup: parent.group,
},
})
if (child) {
parent.child = child
await this.searchChildQna(child.depth + 1, child)
}
return parent
}
return parent
}
}
결론
이와 같이 자신의 함수를 계속 사용하여 반복되는 작업을 하는 재귀함수에 대해 살펴보았습니다.
재귀함수의 중요포인트는 자신의 값을 인자로 받아서 원하는 결과 값을 얻을 때 까지 작업을 반복하는 특성이 있습니다.
부족하지만 재귀함수에 대해서 배우고 사용한 것에 대해 나누어보았습니다.
- Total
- Today
- Yesterday
- js syntax
- 재미있는
- 포인터
- opencv
- NestJS
- raspberrypi
- 라즈베리파이
- QT
- 미라클모닝
- CSS
- 20.03.11.(목)
- 스타벅스
- SQL
- JSON
- Kernel
- 오늘의 공부
- variable
- 자바스크립트
- tailwind
- Til
- C
- Linux
- JS
- yocto
- tailwindcss
- var
- Python
- JavaScript
- 모닝독서
- 초아
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
