c언어 자릿수들의 곱 재귀함수 질문

조회수 1478회

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*뒤에 인자 값 이렇게 되는 거 아닌가요? 정말 이해하기 함듭니다요.

  • 실행이 안돼서 질문하신 것 같지는 않은데 정확히 어떤게 궁금하신건가요? HIAOAIH 2020.2.13 23:44

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)