2013-08-30 2 views
1

오늘 우리의 활동에 우리는 자릿수로 재귀를 사용하도록했습니다. 나는 이미이 프로그램을 만들었습니다 :C에서 재귀를 사용하는 디지트의 합

int main() 

{ 
int num = 0, sum; 

printf("Enter an integer: "); 
scanf("%d",&num); 

//counter=1; 

for (sum=0; num>0;) 

{ 
    sum = sum + num % 10; 
    num = num /10; 
    } 
printf("Sum = %d", sum); 

getch(); 
return 0; 

} 

선생님은 "입출력은 main() 함수에서 수행되어야합니다."라고 덧붙였습니다. 옳은 일을하고 있습니까? 아니면 내 코드에서 뭔가 빠졌습니까?

+4

이것은 반복적 인 (for 루프) 솔루션이며 재귀를 사용하지 않습니다. – FrankPl

답변

2

재귀를 수행하려면 for 루프를 사용하는 대신 되풀이되는 함수를 만듭니다.

int SumDigits(int i) { 
    if (i < 10) { 
    return i; 
    } 
    else { 
    return i%10 + SumDigits(i/10); 
    } 
} 


scanf("%d", &i); 
printf("%d\n", SumDigits(i)); 
+0

나는 복수심으로'if ... return ... else' 구조를 절대적으로 싫어한다 :-) – paxdiablo

+0

@paxdiablo 나는별로 사용하지 않는다. 새로운 사람들을 이해하는 것이 더 쉬운 것처럼 보입니다. 나는 당신의 포스트의 스타일이나 - 헐떡 거림 -'return (i <10)을 선호합니까? foo : bar; – chux

1

당신이 가지고있는 것은 반복적 인 해결책이며 재귀적인 해결책은 아닙니다.

재귀는 고정 된 종점을 향해 항상 문제의 단순한 버전으로 문제를 정의하는 것을 포함합니다.

이 경우 고정 끝점은 10보다 작은 임의의 수이며 그 값은 해당 숫자입니다.

단순한 경우 (9보다 큰 수의 경우)로 전환하는 것은 숫자를 10으로 나눈 결과에 최하위 숫자를 더하는 것입니다 (정수 나누기).

클래스 워크이므로 의사 코드 만 두려워합니다.

def digitSum (n): 
    if n < 10: 
     return n 
    return (n % 10) + digitSum (n/10) 

숫자가 314 인 경우 어떤 일이 발생하는지 알 수 있습니다. 재귀 레벨 1에서

  • , n == 314는 그래서 4를 얻을 수 314 % 10을 계산하고 digitSum(31)를 호출합니다.
    • 재귀 수준 2에서 n == 31이므로 31 % 10을 계산하여 1이되고 digitSum(3)이 호출됩니다. 재귀 수준 세에서
      • , n == 3는 그래서 그것은 단지는 기억 1에 추가 4로 반환 것, 3
    • 돌아 수준이 최대 반환합니다.
  • 위로 레벨 1까지 백업하십시오. 기억 한 4에 추가되고 8으로 반환됩니다.

따라서 314의 자릿수 합은 8입니다.