Le programme factoriel récursif en C se bloque lors de l’exécution

J’écris un programme pour afficher le temps nécessaire pour calculer une factorielle d’un nombre donné 2 millions de fois. Je l’écris à l’aide de Debian Linux dans l’environnement Eclipse C / C ++. Lorsque le programme arrive à int temp = n * rfact(n-1); , il se bloque et ne fera rien d’autre.

Voici ce que j’ai jusqu’à présent:

 #include  #include  //prototypes int rfact(int n); main() { int n = 0; int i = 0; double result = 0.0; clock_t t; printf("Enter a value for n: "); scanf("%i", &n); printf("n=%i\n", n); //get current time t = clock(); //process factorial 2 million times for(i=0; i<2000000; i++) { rfact(n); } printf("n=%i\n", n); //get total time spent in the loop result = (clock() - t)/(double)CLOCKS_PER_SEC; //print result printf("runtime=%d\n", result); } //factorial calculation int rfact(int n) { int temp = n * rfact(n-1); printf(i++); return temp; } 

    Vous manquez le cas de base, vous êtes donc dans une récursion infinie. Vous devez vous arrêter lorsque vous arrivez à n == 1 ou n == 0 :

     int rfact(int n) { if (n <= 0) return 1; return n * rfact(n-1); } 

    De plus, la fonction factorielle n'est pas vraiment le meilleur cas d'utilisation pour la récursivité car la version itérative est sans doute plus lisible et peut-être beaucoup plus rapide, mais c'est une autre histoire 🙂

    Il n’y a pas de cas de base dans votre fonction de rfact. Cela signifie que le rfact (n-1) sera appelé pour toujours.

    Je suis d’accord avec les gens au-dessus de moi, vous manquez le cas de base de la récursivité

    Mais sachez que vous faites une parsing factorielle 2’000’000 fois, votre variable ira trop loin en prenant beaucoup de temps pour que le calcul soit terminé.