Passaggio da funzione ricorsiva a iterativa

di il
2 risposte

Passaggio da funzione ricorsiva a iterativa

Ciao! Devo convertire la seguente funzione ricorsiva in una iterativa in C provando col seguente metodo. Il risultato è un array di 5 elementi (cl); la funzione iterativa mi dà gli stessi risultati di quella ricorsiva tranne per qualche valore dell'intero e (ad es. per e = 7). Qualcuno ha un'idea di dove sto sbagliando?

float ric_func(struct matrice* ch_d, struct matrice* ch_s, struct matrice* th, struct matrice* feat, struct matrice* val, int n, struct matrice* xt, struct matrice* cl, int ncl, struct matrice* count, int e, int el) {
cl->rig = 1; cl->col = ncl;
cl->N = (float*)malloc(sizeof(float) * cl->rig * cl->col);
if (th->N[n + count->M[e]] != -2) {
 if (xt->N[feat->M[n + count->M[e]] + el * xt->col] < th->N[n + count->M[e]]) {
  if (ch_s->M[n + count->M[e]] != -1) {
   for (int j = 0; j < ncl; j++) {
    cl->N[j] = val->N[ch_s->M[n + count->M[e]] * ncl + j];
   }
   ric_func(ch_d, ch_s, th, feat, val, ch_s->M[n + count->M[e]], xt, cl, ncl, count, e, el);
  }
 }
 else {
  if (ch_d->M[n + count->M[e]] != -1) {
   for (int j = 0; j < ncl; j++) {
    cl->N[j] = val->N[ch_d->M[n + count->M[e]] * ncl + j];
   }
   ric_func(ch_d, ch_s, th, feat, val, ch_d->M[n + count->M[e]], xt, cl, ncl, count, e, el);
  }
 }
}
else {
 for (int j = 0; j < ncl; j++) {
  cl->N[j] = val->N[(n + count->M[e]) * ncl + j];
 }
}
return 0;
}

float* iter_func(int* ch_d, int* ch_s, float* th, int* feat, float* val, float* xt, float* cl, int ncl, int* count, int e, int el, int nb) {
	int n = 0;
	while (th[n]!= -2) {
		if (xt[feat[n] + el * nb] < th[n]) {
			if (ch_s[n] != -1) {
				for (int j = 0; j < ncl; j++) {
					cl[j] = val[ch_s[n] * ncl + j];
				}
				n = ch_s[n] + count[e];
			}
		}
		else {
			if (ch_d[n] != -1) {
				for (int j = 0; j < ncl; j++) {
					cl[j] = val[ch_d[n] * ncl + j];
				}
				n = ch_d[n] + count[e];
			}
		}
	}
	for (int j = 0; j < ncl; j++) {
		cl[j] = val[n * ncl + j];
	}
	return cl;
}

2 Risposte

  • Re: Passaggio da funzione ricorsiva a iterativa

    Secondo quale TEORIA tu supponi che un “povero cristo” che si trovi davanti questo “mattone” riesca a CAPIRE di che si tratta?

    Partendo dalla BANALE considerazione che la funzione DOVREBBE ESSERE LA STESSA ma SOLO con l'implementazione DIVERSA?

    Mentre qui abbiano DUE funzioni con parametri DIVERSI e 

    SENZA UNA LINEA DI COMMENTO.

    Se uno studente mi presenta del codice SENZA una riga di commento, lo mando all'ISTANTE a programmare in Malbolge ;-)

  • Re: Passaggio da funzione ricorsiva a iterativa

    Capisco che sia difficile da comprendere, diciamo che è un albero decisionale in cui se una condizione è vera si segue il ramo di sinistra(ch_s) mentre se falsa il ramo di destra (ch_d). In realtà gli argomenti sono i medesimi a parte che nella prima utilizzo strutture mentre nella seconda i campi delle strutture:

    struct matrice {
    int rig;
    int col;
    int* M;
    float* N;
    };
Devi accedere o registrarti per scrivere nel forum
2 risposte