c언어 자릿수들의 곱 재귀함수 질문
조회수 1476회
3자리로 이루어진 자연수 3개를 입력받아 그 수들의 곱을 구한 후 그 결과값의 각 자리 숫자들중 0을 제외한 모든 수들의 곱을 구하여 출력하는 프로그램을 재귀함수로 작성하시오.
- 입력: 100 123 111
- 출력: 270
도움말: 입력예제의 세 수의 곱은 1365300이다. 그러므로 1 * 3 * 6 * 5 * 3 = 270 1의 자리수 * 1의 자리를 제외한 남은 자리수의 곱 (단 1의 자리수가 0이면 1로 바꾸어서 곱한다.)
코드입니다.
#include <stdio.h>
int cal(int mul, int num)
{
if(!(mul/10))
return num*mul;
if(mul%10)
return cal(mul/10, num*(mul%10));
else
return cal(mul/10, num);
}
int main(void)
{
int inp1, inp2, inp3;
scanf("%d %d %d", &inp1, &inp2, &inp3);
int mul = inp1*inp2*inp3;
printf("%d", cal(mul, 1));
return 0;
}
저는 재귀함수가 호출 호출 호출 호출하고 호출된 값을 거슬러 올라가서 값을 구하는 방식인 거라고 생각합니다. 이렇게 이해 했습니다.
제 생각대로라면 두 번째 if문에서 num/10을 계속해서 호출할 때, 만약 mul값이 135780이라고 하면 13578 1357 135 13 1 이렇게 값이 반영되고 이 반영된 값이 뒤에 있는 인자 값이랑
1* 뒤에 인자 값 13*뒤에 인자 값 135*뒤에 인자 값 13578*뒤에 인자 값 이렇게 되는 거 아닌가요? 정말 이해하기 함듭니다요.
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
자릿수곱
이 각 자리수의 곱을 리턴하는 함수라고 하자고요.자릿수곱(123) = 1 x 2 x 3 = 6
간단하게 구할 수 있겠죠.
그런데, 이렇게 전체를 다 보지 말고, 123 을 12 과 3 으로 나누어 놓고 보면,
자릿수곱(123) = 자릿수곱(12) x 3
이런 관계가 성립하겠죠.
자릿수곱
함수가 어떻게 생겨먹은 함수인지 몰라도 이 관계가 성립해요. 이 관계를 가지고 함수를 구현한 것이 재귀함수입니다.재귀함수를 구현할 때 재귀호출이 끝나는 조건이 언제나 필요한데, 여기서는
자릿수곱(1)
과 같이 한자릿수가 들어왔을 때이죠. 이 때는 그냥 들어온 자체가 함수값(리턴값)이 됩니다.위 문제에서는 0인 자릿수는 곱하지 않는다는 조건이 있어서 조금 어려운 듯 한데, 뭐 그리 많이 어려운 건 아닙니다. if 조건만 하나 만들면 되니까요.
설명이 이해가 되나요?
- 재귀함수를 5번 호출 했다면 이 호출한 함수들을 거슬러 올라 가는 게 아니라 거기서 딱 리턴이 걸렸을 때 (mul이 1의 자리일 때) mul*num한 값을 바로 출력해 주는 건가요? 제가 재귀함수를 잘못 배웠나 봅니다..... 알 수 없는 사용자 2020.2.14 12:23
- 자기 생각을 좀 더 자세하고 정확하게 글로 써보시겠어요? 질문을 이해할 수 없습니다. 그리고, 자신의 생각을 정확하게 글로 써보려 노력하면서, 깨닫기도 하거든요. 프로그래밍도 두루뭉실한 생각을 차근차근 정리하면서 써내려가는 겁니다. nowp 2020.2.14 12:38
- 재귀함수를 더 공부해 봐야 할 거 같아요 ㅋㅋㅋ.. 기본적인 걸 익히고 질문하면 더욱 수월할텐데, 그러지 못해서 더 공부해야겠습니다. 알 수 없는 사용자 2020.2.14 14:42
댓글 입력