2010-12-13 4 views
-1

예를 들어 n = 8135267 => 16 다음은 해결책이지만 이해할 수 없습니다.정수의 홀수를 더하는 재귀 함수

int sumOddDigits(int n) { 

if(n == 0) 
    return 0; 

if(n%2 == 1) //if n is odd 
    //returns last digit of n + sumOddDigits(n/10) => n/10 removes the last digit of n 
    return n % 10 + sumOddDigits(n/10) 

else 
    return sumOddDigits(n/10); 

} 
+0

코드는 명확하고 간단합니다. 그럼 네 질문은 뭐니? – TonyK

+0

작은 숫자를 골라 내고 이것을 종이로 걸어 라. 실제로, 당신이 여기서 얻을 수있는 설명만큼 명확 할 것입니다. –

+0

디버거에서 단계별로 실행하고 어떤 일이 일어 났는지 보았습니까? –

답변

2

정수로 10을 나누면 마지막 자릿수를 "잘라 버립니다". 1234/10의 결과는 123입니다.

모듈로 10은 마지막 숫자, 즉 1234%10의 결과를 4으로 반환합니다.

따라서 위 코드는 항상 마지막 숫자를 고려합니다. 마지막 숫자가 홀수 인 경우 (따라서 %2==1 항목) 카운트됩니다. 그렇지 않은 경우 카운트됩니다. 따라서 숫자를 계산해야하는 경우 마지막 숫자 (% 10 -stuff)를 취해 나머지 숫자 (/10 -stuff를 사용하는 재귀)로 계산을 계속하고 숫자에 추가합니다. 현재 자릿수를 계산하지 않으면 나머지 자릿수 (따라서 재귀 및 /10)가 현재 자릿수에 추가되지 않고 계속됩니다.

인수가 0이면

,이 전체 개수는, 이송되고, 따라서 함수가 0.1

0

그것에 대해 이런 식으로 생각 : 8135267 => 16 당신의 알려진 대답을 시작으로, 내가 당신이 무엇을 할 것, * 8135267 * 3에서 홀수 숫자의 합계를 요구한다면? * 4 * 8135267을 요청하면 어떻게됩니까? 해당 기능과 관련된 수동 단계는 무엇입니까?

1

%는 modulo 연산자입니다. 기본적으로 나머지 숫자는 숫자로 나눕니다.

n % 2n은 홀수 인 경우 1입니다. % 10은 숫자를 10으로 나눈 나머지를 얻습니다. 이것은 현재 마지막 숫자를 가져옵니다. 정수 나누기 10은 현재 마지막 숫자 (1567/10 = 156)로 다음 자릿수를 가져옵니다.

0

생각해 이런 식으로 복귀 종료 것을 의미한다. 짝수 숫자를 얻으면 함수는 그 숫자가없는 숫자의 함수 값을 반환합니다. 그렇지 않으면 마지막 숫자가없는 숫자의 함수 값을 반환합니다. 귀하의 예 :

813526(7) -> 0 + sumEvenDigits(813526) 
         6 + sumEvenDigits(81352) 
           2 + sumEvenDigits(8135) 
              .... 
              8 + sumEvenDigits(0) 
                 0 = 16 

희망이 있습니다.

+0

당신은 이상한 자릿수가 아닌 짝수를 덧붙였다.). – caf

+0

고맙습니다. 편집 해 드리 겠지만 요점은 여전히 ​​있습니다. – Chris