J'essaie juste de comprendre comment ce code fonctionne. Disons que l'entier est 4, je comprends que 4 est vérifié par rapport au cas de base, puis la méthode s'appelle à nouveau cette fois avec l'entier 3, puis le même modèle se produit jusqu'à ce que l'entier soit 1. Ma question est de savoir comment la partie de sommation est effectuée ? Quel serait le résultat final?

public int sum(int num)
{
   int result;
   if (num == 1)
      result = 1;
   else
      result = num + sum(num-1);
   return result;
}
0
Charles 26 avril 2017 à 07:10

3 réponses

Meilleure réponse

Comme je pense que vous vous en rendez compte sur la base de votre message, la magie opère ici: result = num + sum(num-1); Pensez-y comme une chaîne d'appels de méthodes. Logiquement, l'ensemble du processus pourrait être représenté comme ceci:

sum(4);

Évalue à

4 + sum(3);

Qui évalue à

4 + 3 + sum(2);

Qui évalue à

4 + 3 + 2 + sum(1);

Qui évalue à

4 + 3 + 2 + 1

Ce qui est égal à

10
2
nhouser9 26 avril 2017 à 04:16

Cela se passe ici:

result = num + sum(num-1);

Ensemble avec

return result;

L'itération n appelle à nouveau sum () (déclenchant l'itération n + 1 ). Le résultat de n + 1 est renvoyé; et ajouté à n ; donnant le résultat de n-1 (à cause de la dernière instruction return).

Et pour mémoire: je n'ai pas inclus la solution finale dans ma réponse; comme vous pouvez le comprendre facilement par vous-même; soit en exécutant ce code; ou en utilisant un stylo et un morceau de papier pour "exécuter" ce code "manuellement".

1
GhostCat 26 avril 2017 à 04:48

La sommation se produit lorsque les appels récursifs reviennent dans la pile. Vois ici:

             sum(4)   # The initial function call
               |
          |---------------|
          | 4 + sum(4-1)  |     # num + recursive call
                  |
              |---------------|
              | 3 + sum(3-1)  |  # the next num + the next recursive call
                      |
                  |---------------|
                  | 2 + sum(2-1)  |
                          |
                        |---|
                        | 1 |    # Base case num == 1

Si vous remplissez chaque appel récursif sum(...) avec la valeur en dessous, qu'obtenez-vous? Les sommes s'additionnaient. C'est là que l'ajout se produit.

Tracez-le et découvrez quelle devrait être la valeur pour vous-même. Ou exécutez le code.

1
xandermonkey 26 avril 2017 à 04:16