N 36 21 22
E 127 23 46
Archive vol. 01
Depth0000mSURFACE
Research Note / Development

재귀함수가 뭔가요?<17478>

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;
}

오랜만에 재귀함수를 다뤄봤는데 진짜 생각 안하고 하나 하나 추가하면서 했다. 일단 내가 생각했을 때 문제점은

  1. print__() 함수가 너무 반복되어서 호출된다.

  2. 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분 정도 걸리는 듯.