2012-08-14 5 views
0

Je suis nouveau au langage de programmation C et j'essaie d'apprendre la récursivité pour calculer la factorielle d'un nombre donné. Ma question est l'instruction de débogage printf est l'impression 2,6,24,120 si je saisis '5'. Comment imprimer 4 fois si les appels de fonction sont remplacés par les valeurs correspondantes et calcule la factorielle à la fois?Déboguer la récursion factorielle

#include<stdio.h> 
#include<stdlib.h> 

int factorial(int n); 

int main() 
{ 
     int num; 
     int fact_val; 
     printf("Enter the number for which you are going to compute the factorial:"); 
     scanf("%d",&num); 

     fact_val=factorial(num); 

     printf("The factorial of the given number is %d\n",fact_val); 

     return 0; 
} 

int factorial(int n) 
{ 
     int factorial_val; 
     if(n==1) 
     return 1; 
     else 
     { 
       factorial_val=factorial(n-1)*n; 
       printf("Debugger-%d\n",factorial_val); 
     } 
     return factorial_val; 
} 
+0

Apprenez à utiliser les installations de débogage de votre environnement, puis parcourir votre code. Vous apprendrez beaucoup plus que d'utiliser les instructions de débogage printf. –

Répondre

4

Lorsque vous atteignez votre base cas, vous return immédiatement plutôt que l'impression.

Donc vous voyez un printf pour les cas: 5, 4, 3, 2, et quand la fonction est passée 1, la valeur n'est pas imprimée: vous return à la place.

En outre, vous RECURSE avant l'impression, de sorte que les cas sont imprimés dans l'ordre, moins d'abord: la première impression se produit seulement après que vous avez récursifs tout le chemin jusqu'à . D'où vous voyez: 2, 6, 24, 120. Ce n'est que lorsque vous êtes revenu de la récursivité actuelle que la valeur intermédiaire est imprimée.

Ecrivez la récursion pour le rendre plus clair:

5 -> recurse with 4: 
    4 -> recurse with 3: 
     3 -> recurse with 2: 
      2 -> recurse with 1: 
       1 -> base case, just return... 
      printf (1 * 2) = 2; 
     printf (2 * 3) = 6; 
    printf (6 * 4) = 24; 
printf (24 * 5) = 120;