Funzione ricorsiva che verifica uguaglianza array

di il
8 risposte

Funzione ricorsiva che verifica uguaglianza array

Ciao a tutti dovrei progettare una funzione che ha come parametri di ingresso due insiemi e stabilisce ricorsivamente se sono uguali.
Questo è quello che ho fatto ma non so perché non funzione come dovrebbe:
TYPEDEF

typedef struct insieme
 {
	double *arr;     /*array che andrà a contenere gli elementi dell'insieme*/
	int dim;	 /*variabile per il numero di elementi dell'insieme*/
	int ind;	 /*variabile indice per muoversi all'interno dell'array*/
 } insieme_t;
FUNZIONE

/*definizione della funzione per confrontare due insiemi*/
int  confronto ( insieme_t ins1,       /*variabile per rappresentare il primo insieme*/
				insieme_t ins2)      /*variabile per rappresentare il secondo insieme*/
 {
	int  risultato = 0;     		 /*variabile per esportare nella main l'esito del confronto: 0 se diversi, 1 se uguali*/

	if( (ins1.dim) == (ins2.dim) )
	{
		if( (ins1.ind) < (ins1.dim) )
		{
			for ( ins2.ind = 0; (ins2.ind) < (ins2.dim); ins2.ind ++)
				if ( ins1.arr[ins1.ind] == ins2.arr[ins2.ind] )
				{
					ins1.ind ++;
					confronto ( ins1, ins2);
                }
            //else
          //  risultato = 0;

               // return(risultato);
		}
		else
			risultato = 1;
		
	}
	else
    risultato = 0;

	ins1.ind = 0;
	ins2.ind = 0;
	
	return(risultato);

}
CHIAMATA NEL MAIN

int ris;
	ris = confronto(ins1, ins2);
	if(ris == 0)
		printf("I due insiemi sono diversi.\n");
	else
		printf("I due insiemi sono uguali");
P.S.: Gli array si riempono a dovere quindi quella parte di codice non la posto.
Grazie in anticipo!!

8 Risposte

  • Re: Funzione ricorsiva che verifica uguaglianza array

    Raga ma l'ho appena postata, mettetela come importante allora

    https://www.iprogrammatori.it/forum-programmazione/cplusplus/trasformare-funzione-iterattiva-ricorsiva-t38861-15.html#p8626366
  • Re: Funzione ricorsiva che verifica uguaglianza array

    Zack909 ha scritto:


    Ciao a tutti dovrei progettare una funzione che ha come parametri di ingresso due insiemi e stabilisce ricorsivamente se sono uguali.
    Questo è quello che ho fatto ma non so perché non funzione come dovrebbe:
    1) Non descrivi il malfunzionamento, le palle di vetro costano...
    2) all'interno della funzione ricorsiva cosa fai del risultato della funzione stessa dopo averla chiamata???
  • Re: Funzione ricorsiva che verifica uguaglianza array

    1) Dice sempre che gli insiemi sono uguali
    2)Il risultato (0 o 1) lo rimanda come variabile e la mette dentro "ris"(nel main) per poi dire se sono uguali o diverse
  • Re: Funzione ricorsiva che verifica uguaglianza array

    Zack909 ha scritto:


    1) Dice sempre che gli insiemi sono uguali
    2)Il risultato (0 o 1) lo rimanda come variabile e la mette dentro "ris"(nel main) per poi dire se sono uguali o diverse
    Guarda che ti manca il return sulla chiamata ricorsiva di confronto(), altrimenti il codice passa avanti. Anche il ++ non funziona ricorsivamente per i parametri passati per valore.

    Consiglio (vale anche per l'altro ragazzo): scaricatevi Visual C++, NetBeans+Mingw o qualsiasi altro IDE e debuggate passo per passo, così vi togliete i dubbi. Se proprio siete bloccati la soluzione da testare è stata postata
  • Re: Funzione ricorsiva che verifica uguaglianza array

    Weierstrass ha scritto:


    Zack909 ha scritto:


    1) Dice sempre che gli insiemi sono uguali
    2)Il risultato (0 o 1) lo rimanda come variabile e la mette dentro "ris"(nel main) per poi dire se sono uguali o diverse
    Guarda che ti manca il return sulla chiamata ricorsiva di confronto(), altrimenti il codice passa avanti. Anche il ++ non funziona ricorsivamente per i parametri passati per valore.

    Consiglio (vale anche per l'altro ragazzo): scaricatevi Visual C++, NetBeans+Mingw o qualsiasi altro IDE e debuggate passo per passo, così vi togliete i dubbi. Se proprio siete bloccati la soluzione da testare è stata postata
    Scusa l'ignoranza il return sulla chiamata ricorsiva del confronto() sarebbe??
  • Re: Funzione ricorsiva che verifica uguaglianza array

    Weierstrass ha scritto:


    Zack909 ha scritto:


    1) Dice sempre che gli insiemi sono uguali
    2)Il risultato (0 o 1) lo rimanda come variabile e la mette dentro "ris"(nel main) per poi dire se sono uguali o diverse
    Guarda che ti manca il return sulla chiamata ricorsiva di confronto(), altrimenti il codice passa avanti. Anche il ++ non funziona ricorsivamente per i parametri passati per valore.

    Consiglio (vale anche per l'altro ragazzo): scaricatevi Visual C++, NetBeans+Mingw o qualsiasi altro IDE e debuggate passo per passo, così vi togliete i dubbi. Se proprio siete bloccati la soluzione da testare è stata postata
    Ho provato a mettere una printf subito prima della return e me la stampa più volte come in un ciclo, come è possibile? Quando la funzione arriva alla return non si dovrebbe arrestare e ritornare il valore?
  • Re: Funzione ricorsiva che verifica uguaglianza array

    Zack909 ha scritto:


    Weierstrass ha scritto:


    Zack909 ha scritto:


    1) Dice sempre che gli insiemi sono uguali
    2)Il risultato (0 o 1) lo rimanda come variabile e la mette dentro "ris"(nel main) per poi dire se sono uguali o diverse
    Guarda che ti manca il return sulla chiamata ricorsiva di confronto(), altrimenti il codice passa avanti. Anche il ++ non funziona ricorsivamente per i parametri passati per valore.

    Consiglio (vale anche per l'altro ragazzo): scaricatevi Visual C++, NetBeans+Mingw o qualsiasi altro IDE e debuggate passo per passo, così vi togliete i dubbi. Se proprio siete bloccati la soluzione da testare è stata postata
    Ho provato a mettere una printf subito prima della return e me la stampa più volte come in un ciclo, come è possibile? Quando la funzione arriva alla return non si dovrebbe arrestare e ritornare il valore?
    Se tu avessi
    
    bool fun2(...){
    	printf(...);
    	return true;
    }
    
    bool fun1(...){
    	printf(...);
    	return fun2(...);
    }
    
    Chiamando fun1() quante printf ti aspetteresti? Perché ti aspetti qualcosa di diverso se fun1 chiamasse se stessa invece di fun2?
  • Re: Funzione ricorsiva che verifica uguaglianza array

    Weierstrass ha scritto:


    Zack909 ha scritto:


    Weierstrass ha scritto:




    Guarda che ti manca il return sulla chiamata ricorsiva di confronto(), altrimenti il codice passa avanti. Anche il ++ non funziona ricorsivamente per i parametri passati per valore.

    Consiglio (vale anche per l'altro ragazzo): scaricatevi Visual C++, NetBeans+Mingw o qualsiasi altro IDE e debuggate passo per passo, così vi togliete i dubbi. Se proprio siete bloccati la soluzione da testare è stata postata
    Ho provato a mettere una printf subito prima della return e me la stampa più volte come in un ciclo, come è possibile? Quando la funzione arriva alla return non si dovrebbe arrestare e ritornare il valore?
    Se tu avessi
    
    bool fun2(...){
    	printf(...);
    	return true;
    }
    
    bool fun1(...){
    	printf(...);
    	return fun2(...);
    }
    
    Chiamando fun1() quante printf ti aspetteresti? Perché ti aspetti qualcosa di diverso se fun1 chiamasse se stessa invece di fun2?
    
    /*definizione della funzione per confrontare due insiemi*/
    int  confronto ( insieme_t ins1,       /*variabile per rappresentare il primo insieme*/
    				insieme_t ins2)      /*variabile per rappresentare il secondo insieme*/
     {
    	int risultato =0;     		 /*variabile per esportare nella main l'esito del confronto: 0 se diversi, 1 se uguali*/
    
    	if( (ins1.dim) == (ins2.dim) )
    	{
    		if( (ins1.ind) < (ins1.dim) )
    		{
    			for ( ins2.ind = 0; (ins2.ind) < (ins2.dim); ins2.ind ++)
    				if ( ins1.arr[ins1.ind] == ins2.arr[ins2.ind] )
    				{
    					ins1.ind++;
    
    					 risultato = confronto ( ins1, ins2);
    					 
    
                    }
               
    		}
    		else
    			risultato = 1;
    	}
    	else
        risultato = 0;
    
    	ins1.ind = 0;
    	ins2.ind = 0;
    
    	
    	return (risultato);
    }
    
    
    Ho risolto in questo modo Grazie Mille!!
Devi accedere o registrarti per scrivere nel forum
8 risposte