Funzione Ricorsiva

di il
7 risposte

Funzione Ricorsiva

Salve ragazzi ,
sono intrappolato in questo esercizio:
#include <stdio.h>
#include <stdlib.h>

int somma (int *);

int main (void)
{
int n, i;
int *vett;
int x;

printf("Dimmi quanti valori vorresti sommare: ");
scanf("%d", &n);

vett = (int *) malloc(n * sizeof(int));

printf("Dammi questi valori: \n");
for (i=0; i< n; i++){
	scanf("%d", &vett[i]);
}
x = *vett;

printf("La somma vale: %d", somma (&x));

free (vett);
return 0;
}

int somma(int *v)
{
	int a;
	int *ris = 0;
	
	a = *v;
	*ris = somma (a ) + somma (*(a+1));
	return *ris;
}
Gli errori sono questi:

gcc -Wall -o"somma_ricorsiva" "somma_ricorsiva.c" -lm (nel direttorio: /home/antonio/Documenti)
somma_ricorsiva.c: In function ‘somma’:
somma_ricorsiva.c:38:2: warning: passing argument 1 of ‘somma’ makes pointer from integer without a cast [enabled by default]
*ris = somma (a ) + somma (*(a+1));
^
somma_ricorsiva.c:32:5: note: expected ‘int *’ but argument is of type ‘int’
int somma(int *v)
^
somma_ricorsiva.c:38:29: error: invalid type argument of unary ‘*’ (have ‘int’)
*ris = somma (a ) + somma (*(a+1));
^
Compilazione fallita.

vi prego aiutatemi
Allegati:
16176_08fe43bb17b5ea4b1625dc149f720782.png
16176_08fe43bb17b5ea4b1625dc149f720782.png

7 Risposte

  • Re: Funzione Ricorsiva

    Elimina il VERDE dal listato e usa i tag CODE altrimenti è illeggibile !!

    E fai copia incolla del testo degli errori, non mostrare l'immagine statica !
  • Re: Funzione Ricorsiva

    Come ha detto @oregon!

    E visto che ci sei

    1) osserva bene come hai definito a
    2) osserva bene come hai definito somma
    3) osserva bene come hai definito ris (usato cosi' non c'azzecca per niente)
    4) ristudiati il concetto di vettore in C,
    5) ristudiati il concetto di accesso ad un elemento di un vettore in C

    Gli ORRORI sono banali!

    Se non lo capisci ancora, lascia stare la funzione ricorsiva e concentrati sul problema:

    definire un vetore
    accedere all'elemento i-mo di un vettore

    Dove i deve essere maggiore di 0!
  • Re: Funzione Ricorsiva

    Ancora un suggerimento ... la funzione ricorsiva, ad un certo punto, deve terminare senza chiamare ancora sé stessa. Nella tua funzione NON tieni conto di quanti elementi dell'array stai sommando, ovvero non tieni conto del fatto che non hai più elementi da sommare e continui a farlo senza controllo ...

    P.S. Ma il colore nero ti dà proprio fastidio ... deve essere verde o rosso?
  • Re: Funzione Ricorsiva

    Grazie ragazzi, cercherò di seguire il vostro consiglio...
  • Re: Funzione Ricorsiva

    Ulteriore suggerimento ... la funzione la modificherei così
    
    int somma(int *v, int n)
    {
    	int el=v[n];
    
    	if (n==0) return el;
    
    	return(el + somma(v, n-1));
    }
    
    Rifletti su come chiamarla correttamente nel main ...
  • Re: Funzione Ricorsiva

    #include <stdio.h>
    #include <stdlib.h>
    
    int somma (int *, int);
    
    int main (void)
    {
    int n, i;
    int *vett;
    int x;
    
    printf("Dimmi quanti valori vorresti sommare: ");
    scanf("%d", &n);
    
    vett = (int *) malloc(n * sizeof(int));
    
    printf("Dammi questi valori: \n");
    for (i=0; i< n; i++){
    	scanf("%d", &vett[i]);
    }
    x = *vett;
    
    printf("La somma vale: %d", somma (&x, n));
    
    free (vett);
    return 0;
    }
    
    int somma(int *v, int m)
    {
       int el=v[m];
    
       if (m==0) return el;
    
       return(el + somma(v, m-1));
    }
    ho provato chiamandola così la funzione, non da nessun errore però la somma di 1+1+1 esce 10723348....
  • Re: Funzione Ricorsiva

    Sono più che sicuro che in questo modo mi visualizza l'indirizzo di memoria a cui è allocato quel risultato invece di visualizzare quest' ultimo...
Devi accedere o registrarti per scrivere nel forum
7 risposte