Récursion utilisant la fonction main ()

J’écris un programme pour calculer factorielle en utilisant la récursivité de main fonction main ().

 /* Print factorial */ #include  #include  static char **p; int main(int argc, char **argv) { int n, rv; if (argc < 2) { printf("Usage: a.out \n"); exit(-1); } n = atoi(argv[1]); if (!n) { rv = 0; } else { if (n == 1) { rv = 1; } else { n = n - 1; **p = n; main(2, p); } } printf("%d\n", rv); return 0; } 

Le programme comstack en utilisant gcc mais lors de l’exécution, je reçois une erreur de segmentation à **p = n . Quelqu’un peut-il m’aider à modifier le programme ci-dessus pour obtenir le résultat correct? En outre, quelle est la logique pour capturer la valeur de rv correcte entre les appels récursifs successifs dans main ()?

Puisque vous ne semblez pas vous soucier des standards et des choses, voici une implémentation de la fonction principale récursive pour l’affichage factoriel, compilée sur gcc (je ne teste que sur Windows). Comme il ne suit pas les standards, il n’y a aucune garantie qu’il comstackra sur un autre compilateur / plate-forme.

Écrire un tel code pour le plaisir est correct, mais ne laissez jamais le mauvais comportement suivre un projet sérieux de codage ou un lieu de travail.

 /* Print factorial */ #include  #include  char buf[16]; int main(int argc, char **argv) { int n, rv; if (argc < 2) { printf("Usage: a.out \n"); exit(-1); } n = atoi(argv[1]); if (!n) { rv = 1; } else { if (n == 1) { rv = 1; } else { char *pt = buf; char **pt2 = &pt - 1; sprintf(buf, "%d", n - 1); rv = main(2, pt2) * n; } } printf("%d\n", rv); return rv; } 

Seul le système d’exploitation peut appeler main lorsqu’il exécute le programme. À part le système d’exploitation, personne ne peut appeler une fonction nommée main . Donc, si vous voulez calculer factorielle en utilisant la récursivité, vous devez écrire une autre fonction pour la calculer récursivement et appeler cette fonction depuis main .

Vous pouvez demander pourquoi est-ce? La réponse est que c’est la syntaxe.