user-0 提问: 求助大神，为什么这段c语言函数是个死循环?

回复:
user: user-1
content: 你这个递归函数怎么没有退出的条件啊

user: user-2
content: afficher_etat定义在哪里？要看看是否递归调用

user: user-0
content: 全部代码我已经没有了，因为我改过了，改过之后就没有死循环了，但是我只是想知道为什么以前那个函数(就是我发的那个)为什么会陷入死循环,现在全部代码如下  #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h>  //EXO1 //Definir le nombre de ligne standarde #define NB_LIGNES 4  #define random(x) (rand()%x)  void sep() {   puts("*********************************************************************"); }   //EXO2 //Affiher l'etat du jeu void afficher_etat(int tableau[]) {   int i = 0;   while(i<NB_LIGNES)     {       printf("Ligne %d ", i);       int m = 0;       while(m<tableau[i]) 	{ 	  char haha = '|'; 	  printf("%c", haha);  	  ++m; 	}       puts("");       ++i;     } }  //EXO3 //Générer aléatoirement un etat initial de jeu avec à partir d'un entier donne void generer_etat(int n, int tab[NB_LIGNES]) {   //coucou = [0,0,0,0];   int cpt=0;   while(!(cpt==n))     {       srand(clock());       int ligne = random(4);       tab[ligne]++;       cpt++;     }   afficher_etat(tab); }  //EXO4 //Determiner si l'etat actuel est un etat final bool est_un_etat_final(int tableau[NB_LIGNES]) {   int i = 0;   int somme = 0;   while(i<NB_LIGNES)     {       somme += tableau[i];       ++i;     }   if(somme>1)     return 0;   return 1; }  //EXO5 //Determiner si une application est possible sur l'etat du jeu bool est_applicable(int ligne, int nombre, int etat[]) {   return nombre>etat[ligne]?0:1; }  //EXO6 //Effectuer une application sur le jeu n'etant pas fini void appliquer(int ligne, int nombre, int * tableau) {   tableau[ligne] -= nombre; }  //EXO7 //Choisir aleatoirement un nombre de ligne pour effectuer une application int choix_aleatoire_ligne() {   return random(NB_LIGNES); }  //EXO8 //Choisir aleatoirement un nombre d'allumettes a enlever sur une ligne donnee int choix_aleatoire_nb_allum(int ligne, int * coucou) {   return 1+random(coucou[ligne]); }    //EXO9 //Simulation d'une partie void simulation_partie(int n){   int tabh[] = {0,0,0,0};   puts("État initial :");   generer_etat(n, tabh);   sep();   while(!(est_un_etat_final(tabh))) {       int ligne = choix_aleatoire_ligne();       while(tabh[ligne]==0) 	{ 	  srand(clock()); 	  ligne = choix_aleatoire_ligne(); 	}       printf("Linge choisie : %d\n", ligne);       int nombre = choix_aleatoire_nb_allum(ligne, tabh);       printf("Nombre choisi : %d\n", nombre);       appliquer(ligne, nombre, tabh);       afficher_etat(tabh);       sep();   }   puts("Game over ! HAHAHA !"); }    //EXO10 //Tester tous les fonctions deja definies void main() {   double start,finish;   start = clock();      srand(time(0));    puts("");   puts("EXO1");   printf("La valeur de NB_LIGNES est %d\n\n", NB_LIGNES);   sep();      puts("EXO2");   puts("Méthode : afficher_etat");   int t1[] = {1,2,3,4};   afficher_etat(t1);   puts("");   sep();       puts("EXO3");   puts("Méthode : generer_etat");   int tab0[] = {0,0,0,0};   generer_etat(9, tab0);   sep();      puts("EXO4");   puts("Méthode : est_un_etat_final\n");   int tableau1[] = {5,9,8,12};   afficher_etat(tableau1);   printf("\nC'est un état final ? : %s\n\n", est_un_etat_final(tableau1)==1?"oui !":"non !");   int tableau2[] = {0,1,0,0};   afficher_etat(tableau2);   printf("\nC'est un état final ? : %s\n\n", est_un_etat_final(tableau2)==1?"oui !": 	 "non !");   int tableau3[] = {0,0,0,0};   afficher_etat(tableau3);   printf("\nC'est un état final ? : %s\n\n", est_un_etat_final(tableau3)==1?"oui !": 	 "non !");   sep();         puts("EXO5");   puts("Fonction : est_applicable\n");   int tableau4[] = {4,5,6,7};   afficher_etat(tableau4);   printf("\nLinge choisie : 3\n");   printf("Nombre d'allumettes à retirer : 18\n");   printf("Applicable ? : %s\n\n", est_applicable(3, 18, tableau4)==1?"oui !":"non !");   printf("Linge choisie : 1\n");   printf("Nombre d'allumettes à retirer : 2\n");   printf("Applicable ? : %s\n", est_applicable(1, 2, tableau4)==1?"oui !":"non !");   sep();     puts("EXO6");   puts("Fonction : appliquer\n");   int tableau5[] = {4,5,6,7};   puts("Avant appliquer\n");   afficher_etat(tableau5);   printf("\nLingne choisie : 3\n");   printf("Nombre choisi : 3\n");   appliquer(3, 3, tableau5);   puts("\nAprès appliquer");   afficher_etat(tableau5);   sep();   puts("");         puts("EXO10");   simulation_partie(10);       /**   int tabb1[] = {0,0,1,3};   printf("%d\n", est_un_etat_final(tabb1));   int tabb2[] = {0,0,0,1};   printf("%d\n", est_un_etat_final(tabb2));   */    finish = clock();   printf("\nDurée d'exécution du program : %f seconds \n", (finish-start)/CLOCKS_PER_SEC);   }

user: user-3
content: 你倒是把代码上全啊

user: user-4
content: 兄弟你先单步一下看看卡在那里了吧，不然一会赵老师又会说，判断是否有成为程序员....，抄报纸之类的了

user: user-4
content: 引用 2 楼 煦风之伤的回复:你这个递归函数怎么没有退出的条件啊 递归函数，递归调用在那里