Trasformare un funzione da iterativa a ricorsiva

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Trasformare un funzione da iterativa a ricorsiva

    Smarties ha scritto:



    Mi da OK quando dovrebbe essere KO
    Va bene, fin qui ci arrivavo. Quali array non ti funzionano?
  • Re: Trasformare un funzione da iterativa a ricorsiva

    Weierstrass ha scritto:




    Va bene, fin qui ci arrivavo. Quali array non ti funzionano?
    In che senso quali array non funzionano?

    Mi fa così
    Inserisci il numero di elementi del primo insieme: 3
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    
    Gli elementi dell'insieme 1 sono: 1 2 3 
    
    Inserisci il numero di elementi dell'insieme che vuoi inserire: 3
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    
    Gli elementi dell'insieme 2 sono: 1 2 3 
    
    Gli insiemi sono UGUALI
    _______________________________________________________
    
    Inserisci il numero di elementi del primo insieme: 3
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    
    Gli elementi dell'insieme 1 sono: 1 2 3 
    
    Inserisci il numero di elementi dell'insieme che vuoi inserire: 4
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    Inserisci elemento: 4
    
    Gli elementi dell'insieme 2 sono: 1 2 3 4 
    
    Gli insiemi sono UGUALI
    _________________________________________________________
    
    Inserisci il numero di elementi del primo insieme: 4
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    Inserisci elemento: 4
    
    Gli elementi dell'insieme 1 sono: 1 2 3 4 
    
    Inserisci il numero di elementi dell'insieme che vuoi inserire: 2
    Inserisci elemento: 1
    Inserisci elemento: 2
    
    Gli elementi dell'insieme 2 sono: 1 2 
    
    Gli insiemi sono UGUALI
    
  • Re: Trasformare un funzione da iterativa a ricorsiva

    Smarties ha scritto:


    Weierstrass ha scritto:




    Va bene, fin qui ci arrivavo. Quali array non ti funzionano?
    In che senso quali array non funzionano?

    Mi fa così
    Inserisci il numero di elementi del primo insieme: 3
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    
    Gli elementi dell'insieme 1 sono: 1 2 3 
    
    Inserisci il numero di elementi dell'insieme che vuoi inserire: 3
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    
    Gli elementi dell'insieme 2 sono: 1 2 3 
    
    Gli insiemi sono UGUALI
    _______________________________________________________
    
    Inserisci il numero di elementi del primo insieme: 3
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    
    Gli elementi dell'insieme 1 sono: 1 2 3 
    
    Inserisci il numero di elementi dell'insieme che vuoi inserire: 4
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    Inserisci elemento: 4
    
    Gli elementi dell'insieme 2 sono: 1 2 3 4 
    
    Gli insiemi sono UGUALI
    _________________________________________________________
    
    Inserisci il numero di elementi del primo insieme: 4
    Inserisci elemento: 1
    Inserisci elemento: 2
    Inserisci elemento: 3
    Inserisci elemento: 4
    
    Gli elementi dell'insieme 1 sono: 1 2 3 4 
    
    Inserisci il numero di elementi dell'insieme che vuoi inserire: 2
    Inserisci elemento: 1
    Inserisci elemento: 2
    
    Gli elementi dell'insieme 2 sono: 1 2 
    
    Gli insiemi sono UGUALI
    
    Allora sicuramente hai sbagliato nel main. A me dà il risultato corretto
    int main(void)
    {
    	//double a[5] = {3, -7, 3, -0.5, 1};
    	//double b[5] = {1, 3, -0.5, 3, -7};
        
        	double a[3] = {1, 2, 3};
    	double b[4] = {1, 2, 3, 4};
    
    	if(insiemi_uguali(a, b, sizeof(a)/sizeof(double), sizeof(b)/sizeof(double)))
    		printf("OK");
    	else
    		printf("KO");
    
    	getchar();
    	return 0;
    }
    Posta il tuo di main e vediamo
  • Re: Trasformare un funzione da iterativa a ricorsiva

    Weierstrass ha scritto:



    Posta il tuo di main e vediamo

    Fai conto che ho utilizzato un puntatore per inserire gli elementi nel vettore.
    L'insieme A è insieme1.a.
    L'insieme B è insieme2.a.
    Forse ho sbagliato qualcosa nella if?
    
    
    if(insiemi_uguali(insieme1.a, insieme2.a, sizeof(insieme1.a)/sizeof(double), sizeof(insieme2.a)/sizeof(double)))
    		printf("\n\nGli insiemi sono UGUALI");
    	else
    		printf("\n\nGli insiemi sono DIVERSI");
    
    	getchar();
    
    	return(0);
    
  • Re: Trasformare un funzione da iterativa a ricorsiva

    Attento:
    - sizeof(puntatore) = 32 o 64 bit
    - sizeof(array) = sizeof(singoloelemento) * numelementi

    Io ritengo che calcolare in quel modo il numero di elementi dell'array sia SBAGLIATO. Troppo prono ad errori: da qualche parte li inserisci tu quindi tieni il conto!
  • Re: Trasformare un funzione da iterativa a ricorsiva

    Smarties ha scritto:


    Weierstrass ha scritto:



    Posta il tuo di main e vediamo

    Fai conto che ho utilizzato un puntatore per inserire gli elementi nel vettore.
    L'insieme A è insieme1.a.
    L'insieme B è insieme2.a.
    Forse ho sbagliato qualcosa nella if?
    
    
    if(insiemi_uguali(insieme1.a, insieme2.a, sizeof(insieme1.a)/sizeof(double), sizeof(insieme2.a)/sizeof(double)))
    		printf("\n\nGli insiemi sono UGUALI");
    	else
    		printf("\n\nGli insiemi sono DIVERSI");
    
    	getchar();
    
    	return(0);
    
    Se non posti tutto il codice è dura dirti esattamente cosa hai sbagliato. Faccio prima a postarti il programma
    
    #include <stdio.h>
    
    struct insieme
    {
      double * a;
      int      l;
    };
    
    bool insiemi_uguali(double a1[], double a2[], int num_elem1, int num_elem2)
    {
    	int i;
    	double temp;
    
    	if(num_elem1 != num_elem2)
    	    return false;
    	
    	if(num_elem1 == 0)
    	    return true;
    	    
    	for(i=0; i<num_elem1; i++)
    	    if(a2[i] == a1[num_elem1 - 1])
    	    {
    	       temp = a2[num_elem1 -1];
    	       a2[num_elem1 - 1] = a2[i];
    	       a2[i] = temp;
    	       return insiemi_uguali(a1, a2, num_elem1 - 1, num_elem2 - 1);
    	    }
    	    
    	return false;
    }
    
    int main(void)
    {
        int n1, n2;
        insieme insieme1, insieme2;
        double d;
        
        printf ("Inserisci il numero di elementi del primo insieme: ");
        scanf (" %d",&n1);
        if(n1 < 0){
            printf ("Valore immesso non valido\n");
            getchar();
            return -1;
        }
        else if(n1 > 0){
            insieme1.a = (double *)malloc(n1*sizeof(double));
            if(insieme1.a == NULL){
                printf ("Memoria insufficiente\n");
                getchar();
                return -1;          
            }
        }   
        insieme1.l = n1;
        while(n1--){
            printf ("Inserisci elemento: ");    
            scanf("%lf",&d);
            insieme1.a[n1] = d;
        }
        
        printf ("Inserisci il numero di elementi del secondo insieme: ");
        scanf (" %d",&n2);
        if(n2 < 0){
            printf ("Valore immesso non valido\n");
            getchar();
            return -1;
        }
        else if(n2 > 0){
            insieme2.a = (double *)malloc(n2*sizeof(double));
            if(insieme2.a == NULL){
                printf ("Memoria insufficiente\n");
                getchar();
                return -1;          
            }
        }   
        insieme2.l = n2;
        while(n2--){
            printf ("Inserisci elemento: ");    
            scanf("%lf",&d);
            insieme2.a[n2] = d;
        }
        
        if(insiemi_uguali(insieme1.a, insieme2.a, insieme1.l, insieme2.l))
    	printf("Gli insiemi sono UGUALI");
        else
    	printf("Gli insiemi sono DIVERSI");
    
        getchar();
        return 0;
    }
    
  • Re: Trasformare un funzione da iterativa a ricorsiva

    Grazie mille ora funziona tutto.
    Scusate se non ci siamo capiti subito, ho iniziato a programmare da poco e non capisco ancora bene come scrivere il codice.
Devi accedere o registrarti per scrivere nel forum
21 risposte