티스토리 뷰
안녕하세요 재귀함수를 실제 사례에서 사용되어지는 예제를 가지고 이야기해보도록 하겠습니다.
함수 안에서 자신의 함수를 호출할 때 재귀함수라고 부릅니다.
그렇다면 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
- NestJS
- 자바스크립트
- 라즈베리파이
- raspberrypi
- JavaScript
- yocto
- Python
- opencv
- tailwind
- 모닝독서
- SQL
- QT
- 포인터
- var
- JSON
- 스타벅스
- Kernel
- CSS
- tailwindcss
- 재미있는
- 초아
- variable
- js syntax
- 미라클모닝
- C
- Til
- 오늘의 공부
- Linux
- 20.03.11.(목)
- JS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |