[C] Max intero dispari funzione ricorsiva

floppyes
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)
/*
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
vict85
"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... :lol:


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.

Obidream
Grazie mille, lo avevo completamente rimosso :)

vict85
Tra l'altro permette di scrivere la funzione fattoriale come:

double fatt(int n)
{
return (n <= 1)? 1. : (n * fatt(n-1) );
}


Anche se a volte rende la lettura molto più difficile.

claudio862
Scusa, ma questa risposta mi sembra un po' confusa:

"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).

Atem1
"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 :D
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

floppyes
Ciao!

Grazie mille per le risposte.. adesso dovrebbe essere più chiaro :D 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 :D

Ciaoo!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.