PDA

View Full Version : [C]Problema funzione ricorsiva.


The-Revenge
02-12-2009, 11:07
Salve, ho un problema con questo codice , è una funzione ricorsiva che dovrebbe generare numeri sparsi casualmente, da 1 a 10, con ripetizione 4 volte.
Simula in pratica il mescolamento di un mazzo di carte napoletane da 40 carte (senza contare il seme).
E' fatto per mezzo di una funzione ricorsiva e dei puntatori, ma il risultato è che a volte mi escono numeri tutti uguali, altre volte mi dice il programma ha smesso di funzionare.
Ecco il codice :

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define dim 40
void genera_num(int *);
int i,k=0;
int *s;
int main(){
int A[dim];
int *s;
s=A;
for(i=0;i<40;i++){
genera_num(s);
s++;
}

for(i=0;i<40;i++)
printf("%d ",A[i]);
system("PAUSE");
return(0);
}




void genera_num(int *b){
int asso,due,tre,quattro,cinque,sei,sette,donna,cavallo,re,a;
srand(time(NULL));
a=rand()%10+1;
switch(a){
case 1:
asso++;
if(asso<5) *b=a;
else genera_num(b);
break;
case 2:
due++;
if(due<5) *b=a;
else genera_num(b);
break;
case 3:
tre++;
if(tre<5) *b=a;
else genera_num(b);
break;
case 4:
quattro++;
if(quattro<5) *b=a;
else genera_num(b);
break;
case 5:
cinque++;
if(cinque<5) *b=a;
else genera_num(b);
break;
case 6:
sei++;
if(sei<5) *b=a;
else genera_num(b);
break;
case 7:
sette++;
if(sette<5) *b=a;
else genera_num(b);
break;
case 8:
donna++;
if(donna<5) *b=a;
else genera_num(b);
break;
case 9:
cavallo++;
if(cavallo<5) *b=a;
else genera_num(b);
break;
case 10:
re++;
if(re<5) *b=a;
else genera_num(b);
break;
}
}

bottomap
02-12-2009, 11:44
Ciao,

La prima cosa da fare è togliere la srand() da dentro la funzione di generazione. La srand inizializza il generatore di numeri casuali ed è sufficiente richiamarla una volta all'inizio del programma.

Se il codice impiega meno di 10msec per una passata di genera_num (e credo proprio sia così), la time() restituirà lo stesso valore per cui il generatore produrrà la stessa sequenza precedente (ergo ottieni valori tutti uguali).

La variabili che usi nella genera_num poi sono locali. Tra un esecuzione e l'altra (rocorsione compresa) non manterranno il loro valore (e a seconda dei compilatori potrebebro essere inizializzate sempre a 0 o, peggio, avere valori sporchi).
Se ad ogni modo fosse così potresti avere un loop infinito di chiamate ricorsive (se per assurdo avessi tutte le condizioni false) che satura velocemente lo stack.

Ciaociao :)

cionci
02-12-2009, 19:47
Non ha senso avere tutti quelle variabili locali. Basta rappresentarle con un vettore di 10 elementi, vettore che poi devi anche passare nella ricorsione.