2010-12-13 74 views
-1

Par exemple n = 8135267 => 16 Voici une solution mais je ne la comprends pas.Fonction récursive qui résume les chiffres impairs d'un entier

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

Le code est clair et simple. Alors, quelle est votre question? – TonyK

+0

Choisissez un nombre plus petit et parcourez ceci sur papier. Vraiment, ce sera aussi clair que toute explication que vous pouvez obtenir ici. –

+0

Avez-vous essayé de l'exécuter par étapes dans un débogueur et de regarder ce qui se passe? –

Répondre

2

Divison entière par dix "coupe" le dernier chiffre: I.e. 1234/10 entraîne des résultats en 123. Le module 10 renvoie le dernier chiffre, c'est-à-dire que 1234%10 donne .

Ainsi, le code ci-dessus considère toujours le dernier chiffre. Si le dernier chiffre est impair (d'où le %2==1) il sera compté, sinon non. Donc, s'il doit compter le chiffre, il prend le dernier chiffre (le % 10 -stuff) et continue de calculer avec les chiffres restants (la récursivité avec le /10 -stuff) et de les ajouter au chiffre. Si le chiffre courant ne doit pas être compté, il continue juste avec les chiffres restants (donc la récursivité et le /10 -stuff) sans l'ajouter au chiffre actuel.

Si l'argument est 0, cela signifie que le nombre entier est parcouru, la fonction se termine ainsi au retour 0.

0

penser de cette façon: A partir de votre réponse connue de 8135267 => 16, si je vous ai demandé la somme des chiffres impairs dans * 3 * 8.135.267, qu'est-ce que vous faire? Que faire si j'ai demandé * 4 * 8135267? Comment vos étapes manuelles se rapportent-elles à cette fonction?

1

% est l'opérateur modulo. Il trouve essentiellement le reste de diviser par un nombre.

n% 2 n est seulement 1 si c'est impair. % 10 obtient le reste de la division du nombre par 10, cela vous obtient le dernier chiffre actuellement. La division entière par 10 vous donne le chiffre suivant comme dernier chiffre actuel (1567/10 = 156)

0

penser de cette façon. Si vous obtenez un chiffre pair, votre fonction le renvoie + la valeur de fonction du nombre sans ce chiffre. Sinon, il renvoie la valeur de fonction du nombre sans le dernier chiffre. Sur votre exemple:

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

Espérons que cela aide.

+0

Vous l'avez montré en ajoutant les chiffres pairs plutôt que les chiffres impairs (ce qui arrive d'avoir la même somme dans ce cas)). – caf

+0

Merci, je vais modifier cela, mais le point est toujours. – Chris