Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

재귀함수 메모리 초과 질문 #164

Closed
rkdbq opened this issue Apr 15, 2022 · 3 comments
Closed

재귀함수 메모리 초과 질문 #164

rkdbq opened this issue Apr 15, 2022 · 3 comments

Comments

@rkdbq
Copy link
Contributor

rkdbq commented Apr 15, 2022

N(0 ≤ N ≤ 12)일 때 N!을 출력하는 문제입니다.
아래 두 코드 중 위의 코드는 정답 처리를 받았고, 아래 코드는 메모리 초과 판정을 받았습니다.
컴파일 시에도 그렇고 제 생각으로는 아래 풀이에 치명적 오류는 없는 것 같은데 메모리 초과 판정을 받은 이유가 궁금합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int factorial(int n) {
	if (n == 0 || n == 1) return 1;
	else return n * factorial(n - 1);
}
int main() {
	int n;
	scanf("%d", &n);
	printf("%d\n", factorial(n));
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int ans = 1;
int factorial(int n) {
	if (n == 0 || n == 1) return 1;
	ans *= n;
	factorial(n - 1);
}
int main() {
	int n;
	scanf("%d", &n);
	factorial(n);
	printf("%d\n", ans);
}
@joonas-yoon
Copy link
Member

joonas-yoon commented Apr 15, 2022

@rkdbq factorial 함수 내에 return 0 을 추가해도 에러가 나나요?

int factorial(int n) {
	if (n == 0 || n == 1) return 1;
	ans *= n;
	factorial(n - 1);
        return 0;
}

최근 표준은 잘 모르겠는데, "프로세스/함수가 잘 끝났음"으로 0을 반환하는게 표준으로 알고 있구요, main문에 보통 이걸 생략하시는데 암시적으로 return 0이 붙는 걸로 알고 있어요.

함수에서는 암시적으로 0이 붙는 지를 모르겠네요. 아마 암시적으로 다른 값이 반환되어서 메모리 해제가 안되는 것일수 있는데 한번 해보실래요?

gcc 8.3 컴파일러 기준으로는 C++14 에서도 똑같이 Runtime Error가 나기는 하네요.

그리고 알아보다가 궁금해진거는, 저 함수는 반환값이 쓰이지 않는데 왜 이런 일이 일어난걸까요... C/C++의 세계는 너무 low 해서 어렵네요

@joonas-yoon
Copy link
Member

음 추가로, main문의 반환을 0이 아닌 return 1 등으로 하면 100% 런타임 에러를 받습니다 ㅎㅎ

@rkdbq
Copy link
Contributor Author

rkdbq commented Apr 15, 2022

@joonas-yoon 답변 감사합니다. 덕분에 함수 메모리 해제에 대해 새로운 사실을 배웠습니다. 조언해주신 대로 factorial 함수 내에 return 0를 추가해주니 정답으로 처리가 됩니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants