Research Note / Development
재귀함수가 뭔가요?<17478>
Development2 min read
BoB 끝나고 바이브 코딩을 조금이라도 극복하기 위한 재활 훈련.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int cnt = 0;
int print__() {
for (int i = cnt; i > 0; i--) {
printf("____");
}
return 0;
}
int print_recursion(int n) {
if (n == 0) {
print__();
printf("\"재귀함수가 뭔가요?\"\n");
print__();
printf("\"재귀함수는 자기 자신을 호출하는 함수라네\"\n");
print__();
printf("라고 답변하였지.\n");
return 0;
}
print__();
printf("\"재귀함수가 뭔가요?\"\n");
print__();
printf("\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n");
print__();
printf("마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n");
print__();
printf("그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n");
cnt++;
print_recursion(n - 1);
cnt--;
print__();
printf("라고 답변하였지.\n");
return 0;
}
int main(void) {
int count = 0;
scanf("%d", &count);
printf("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n");
print_recursion(count);
return 0;
}
오랜만에 재귀함수를 다뤄봤는데 진짜 생각 안하고 하나 하나 추가하면서 했다. 일단 내가 생각했을 때 문제점은
-
print__() 함수가 너무 반복되어서 호출된다.
-
return 0; 를 모든 함수에 추가하여 귀찮아서 호출 후 return 관리를 안 하고 있다.
그 이후 GPT에게 코드 리뷰 해달라고 해보기;
코드 품질 관점:
→ “전역 변수 제거 + void 함수 + 매개변수 기반 설계”만 해도 한 단계 위 코드가 됨
라고 하네요.
일단은 C 언어로 되어 있는 다른 사람의 코드를 한번 보고, C++ 코드도 리뷰해보면서 C++ 코딩 실력도 챙겨보기.
내가 문제점으로 생각한 1번 부분은 보통 C언어 부분에서는 해결을 못한 상태로 반복 호출되는 것을 확인하였음. 2번 문제는 return 0; 처럼 필요 없는 함수들을 void로 바꿔서 해결..
#include <iostream>
using namespace std;
// 현재 재귀 깊이에 따른 들여쓰기를 저장하는 전역 문자열
string str = "";
// 재귀적으로 챗봇의 대화를 출력하는 함수
// n : 앞으로 더 내려갈 재귀 횟수
void recur(int n) {
// 현재 깊이에서의 들여쓰기를 line에 복사
string line = str;
// ===== 기저 조건 (재귀 종료 조건) =====
if (n == 0) {
// 가장 깊은 단계에서 출력되는 질문
cout << line << "\"재귀함수가 뭔가요?\"\n";
cout << line << "\"재귀함수는 자기 자신을 호출하는 함수라네\"\n";
cout << line << "라고 답변하였지.\n";
return;
}
// ===== 일반 재귀 단계 =====
cout << line << "\"재귀함수가 뭔가요?\"\n";
cout << line << "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n";
cout << line << "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n";
cout << line << "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n";
// ===== 재귀 호출 준비 =====
// 다음 깊이로 내려가기 전에 들여쓰기를 한 단계 증가
str += "____";
// 재귀 호출
// n을 1 감소시키면서 더 깊은 단계로 이동
recur(n - 1);
// ===== 재귀 호출이 끝나고 돌아온 시점 =====
// 현재 깊이에서의 마무리 문장 출력
// line을 사용했기 때문에 들여쓰기가 정확히 유지됨
cout << line << "라고 답변하였지.\n";
}
int main() {
ios_base::sync_with_stdio(0);
//입력(cin)과 출력(cout) 사이의 자동 동기화를 끊어서 입출력을 더 빠르게 만들기 위한 설정
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
cout << "어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n";
recur(n);
}
GPT와 함께하는 코드 주석.. string이 있어서 좀 편하게 한 듯?
코딩 재활 중이라서 문제 푸는데 약 30분 정도 걸리는 듯.