PDA

Visualizza la versione completa : [C] - Problema Ricorsione


MrX87
07-02-2009, 21:50
Buonasera a tutti,
ho un problema con questo programma non riesco a capire dove sbaglio la ricorsione.

Ho un vettore di struct contentente tutti i libri a disposizione

typedef struct libri{
char *nome;
float altezza;
float spessore;
float peso;
int ripiano;
int rtemp;
}lb;

e un altra in cui ho salvato il catalogo di una libreria

typedef struct catalogo{
char id[MAXC];
float prezzo;
int nripiani;
int larghezza;
int scartato;
int altezza[MAXR];
int nog[MAXR];
}ct;

di questa ne ho solo una di indice IC mentre le altre per delle questioni di esercizio sono state scartate.
Nella funzione ricorsiva devo assegnare i ripiani ai vari libri in modo d'avere per il modello selezionato calcolare il BILANCIAMENTO MASSIMO in peso tra i vari ripiani (definito come la differenza tra il ripiano con carico maggiore e quello a carico minore) e il peso medio dei libri per ogni ripiano (peso totale per ripiano / numeor di libri messi in quel ripiano)

il modello di libreria su cui devo inserire i libri questa

nome prezzo 4 100 25 25 30 35

dove 4 il numero di ripiani e 25 25 30 35 sono le altezze per ogni ripiano

ho provato a fare due versioni della funzione ricorsiva

1.
In questa funzione mi calcolo s come carico corrente e ns come carico massimizzato utilizzo il vettore libri[nripiani] in modo da salvarmi per ogni ripiano il peso dei libri che metto.
nel vettore nog mi salvo gli oggetti che metto per ogni ripiano.

{ int i;
if(id==nl){
if(s>ns){
ns=s;
for(i=0;i<nl;i++)
l[i].ripiano=l[i].rtemp;
}
return ns;
}
//provo a piazzare un libro su un ripiano
s=trovasbil(libri,c[ic].nripiani);
if(c[ic].altezza[id2]>l[id].altezza){
libri[id2]+=l[id].peso;
l[id].rtemp=id2;
c[ic].nog[id2]++;
ns=cercasoluzione(c,l,nl,ic,id+1,libri,s,ns,id2);
libri[id2]-=l[id].peso;
l[id].rtemp=-1;
c[ic].nog[id2]--;
}
//si prova a vedere cosa succede se il corrente non viene inserito si ricorre sul successivo
ns=cercasoluzione(c,l,nl,ic,id+1,libri,s,ns,id2+1) ;
return ns;
}

//in questa funzione effettuto la differenza per il carico massimo.
float trovasbil(float *libri,int n)
{
int i,min=libri[0],max=libri[0];
int cmin=0,cmax=0;
for( i=1 ; i< n; i++ ){
if( libri[i]>max ){
max = libri[i] ;
cmax = i ;}}
for( i=1 ; i< n; i++ ){
if( libri[i]<min ){
min = libri[i] ;
cmin = i ;}}
return(libri[cmax]-libri[cmin]);
}

La funzione ricorsiva sbagliata, ma non riesco a capire come farla.Accetto tutti i consigli
grazie mille in anticipo.

MrX87
08-02-2009, 11:43
possibile che nessuno s dirmi dove sbaglio? :incupito:

Stoicenko
09-02-2009, 11:05
B se seguissi il regolamento magari qualcuno leggerebbe quel codice.. in questo momento illeggibile..

Loading