[C] Max intero dispari funzione ricorsiva
Ciao a tutti!
Non riesco a trovare dov'è l'errore in questo esercizio:
Scrivere una funzione ricorsiva C che produca il massimo intero dispari in una dato vettore di n variabili intere (0 se il vettore non contiene interi dispari)
Prima ho provato a scrivere il codice senza utilizzare la funzione ricorsiva e funziona tutto quanto (al posto di usare n variabili ho definito n=5)
Ho provato poi a riscrivere il programma creando l'apposita funzione, però continua a darmi come numero massimo lo zero!
Grazie mille
Buon fine settimana
Ciaoo
Non riesco a trovare dov'è l'errore in questo esercizio:
Scrivere una funzione ricorsiva C che produca il massimo intero dispari in una dato vettore di n variabili intere (0 se il vettore non contiene interi dispari)
Prima ho provato a scrivere il codice senza utilizzare la funzione ricorsiva e funziona tutto quanto (al posto di usare n variabili ho definito n=5)
/* Esercizio 6. Scrivere una funzione ricorsiva C che produca il massimo intero dispari in una dato vettore di n variabili intere (0 se il vettore non contiene interi dispari) FacSimileSezione1. */ #include <stdio.h> #define dim1 5 int main () { int num, i, vett[dim1], vettdisp[dim1], flag=0, max=0; for (i=0;i<dim1;i++) { printf("Inserisci il %d° numero: ", i+1); scanf("%d", &num); if (num%2!=0) { vett[i]=num; } } printf("\nNumeri dispari inseriti: "); for (i=0;i<dim1;i++) { printf("%2d", vett[i]); } for (i=0;i<dim1;i++) { if(vett[i]!=0) { max=vett[i]; break; } } for (i=0;i<dim1;i++) { if (vett[i+1]>max && vett[i+1]!=0) { max=vett[i+1]; } } printf("\n\nIl massimo numero dispari: %d", max); return 0; }
Ho provato poi a riscrivere il programma creando l'apposita funzione, però continua a darmi come numero massimo lo zero!
/* Esercizio 6. Scrivere una funzione ricorsiva C che produca il massimo intero dispari in una dato vettore di n variabili intere (0 se il vettore non contiene interi dispari) FacSimileSezione1. */ #include <stdio.h> #define dim1 5 void maxdisp (int vett[]); int main () { int num, i, vett[dim1], max; for (i=0;i<dim1;i++) { printf("Inserisci il %d° numero: ", i+1); scanf("%d", &num); if (num%2!=0) { vett[i]=num; } } printf("\nNumeri dispari inseriti: "); for (i=0;i<dim1;i++) { printf("%2d", vett[i]); } maxdisp (vett); printf("\n\nIl massimo numero dispari: %d", max); return 0; } void maxdisp (int vett[]) { int i; int max=0; for (i=0;i<dim1;i++) { if(vett[i]!=0) { max=vett[i]; break; } } for (i=0;i<dim1;i++) { if (vett[i+1]>max && vett[i+1]!=0) { max=vett[i+1]; } } }
Grazie mille
Buon fine settimana
Ciaoo

Risposte
"Obidream":return (vett[0] > m)? vett[0] : m;
Ciao Vict, questa sintassi cosa significa?
Ricordo di averla incontrata una volta, ma ammetto di aver dimenticato tutto al riguardo...
Operatore ternario, si traduce in
if (vett[0] > m) return vett[0]; else return m;
in generale al posto del return devi mettere un variabile =.
Il vantaggio maggiore è che può essere usata per inizializzare costanti e cose simili in modo sintetico.
Grazie mille, lo avevo completamente rimosso

Tra l'altro permette di scrivere la funzione fattoriale come:
Anche se a volte rende la lettura molto più difficile.
double fatt(int n) { return (n <= 1)? 1. : (n * fatt(n-1) ); }
Anche se a volte rende la lettura molto più difficile.
Scusa, ma questa risposta mi sembra un po' confusa:
Certo che lo sai. Vale 2.
Inoltre moltiplichi 2 (=n) per il fattoriale di n-1, non di n-2.
Certo che lo sai, vale 3. L'hai anche scritto sulla stessa linea: n*fatt(n-1) = 3*fatt(2).
"floppyes":
Grazie per l'esempio, in questo caso mettiamo che x valga 2, allora eseguo la ricorsione. Col pimo if chiedo se n è uguale a 1 o uguale a 0, però non so quanto vale n, quindi passo all'else, qui moltiplico 2 per il fattoriale di n-2.
Certo che lo sai. Vale 2.
Inoltre moltiplichi 2 (=n) per il fattoriale di n-1, non di n-2.
"floppyes":
Se x vale 3 allora ottentevo:
n vale 1 o 0? Non lo so, allora eseguo n*fatt(n-1) quindi 3*fatt2
Certo che lo sai, vale 3. L'hai anche scritto sulla stessa linea: n*fatt(n-1) = 3*fatt(2).
"floppyes":
Ciao!
Grazie per l'esempio, in questo caso mettiamo che x valga 2, allora eseguo la ricorsione. Col pimo if chiedo se n è uguale a 1 o uguale a 0, però non so quanto vale n, quindi passo all'else, qui moltiplico 2 per il fattoriale di n-2.
Poichè n-2=1 allora eseguendo di nuovo il primo if trovo che n è uguale a 1, quindi mi restituisce 1. Allora il fattoriale di 2 è 2*1.
Se x vale 3 allora ottentevo:
n vale 1 o 0? Non lo so, allora eseguo n*fatt(n-1) quindi 3*fatt2
n vale 1 o 0? No allora eseguo n*fatt(n-1) quindi 3*2*fatt(1)
n vale 1 o 0? Si, allora ritorna 1, quindi 3*2*1
Ora è tutto chiaro, il problema è capire bene come scrivere il codice negli esercizi
Grazie
Ciaoo
No! Tu sai sempre quanto vale n, infatti gliel'hai passato proprio tu!
Quello che non sai è quanto vale fatt(n-1). Se ad esempio stai cercando il fattoriale di 4 esso vale:
A.fatt(4) = 4* fatt(3) ===> Non so quanto vale fatt(3) e per scoprirlo lo calcolo
B.fatt(3) = 3* fatt(2) ===> Non so quanto vale fatt(2) e per scoprirlo lo calcolo
C.fatt(2) = 2* fatt(1) ===> dunque n==1 ma abbiamo imposto la condizione che se n==1 allora return 1, cioè fatt(1)=1 dunque possiamo rispondere a C
C.fatt(2)=2*1=2 ora che abbiamo trovato fatt(2) possiamo rispondete a B
B.fatt(3)=3*2=6 ora che abbiamo trovato fatt(3) possiamo rispondete ad A
A.fatt(4)=4*6=24
Ciao!
Grazie mille per le risposte.. adesso dovrebbe essere più chiaro
Quindi la funzione continua a richiamare se stessa fino a quando è soddisfatta la condizione, allora in quel caso trova tutti i valori precedenti.
Grazie ancora, adesso provo a fare altri esercizi con la ricorsione, vediamo se l'ho capita bene
Ciaoo!
Grazie mille per le risposte.. adesso dovrebbe essere più chiaro

Grazie ancora, adesso provo a fare altri esercizi con la ricorsione, vediamo se l'ho capita bene

Ciaoo!