Ir ao conteúdo
  • Cadastre-se
Josesousa

C Função recursiva que calcula a media.

Recommended Posts

Olá, bom dia.

 

Poderiam dá uma olhada no meu código  de um exercício que calcule a media.

Eu normalmente tento fazer com uma função normal, e depois passar para a função recursiva, mas não estou conseguindo essa ultima etapa.

 

Segue o codigo:

 

/*46) Faça uma função recursiva que permita calcular a média um vetor de tamanho N.*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int entrada(int *vet, int n);
void imprimir(int *vet, int n);
float media(int *vet, int n,int );
main(){
    int *vet, n, j=0;
    float md;
    setlocale(LC_ALL, "Portuguese");

    printf("Informe o tamanho do vetor: ");
    scanf("%d", &n);

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

    if(!vet){
        printf("Problemas com a alocação de memória.\n");
        exit(1);
    }
    entrada(vet, n);
    imprimir(vet,n);

    md=media(vet, n, j);

    printf("\n\nA media do vetor e de %f.", md);
}
int entrada(int *vet, int n){
    int i;
    printf("Entre com os valores do vetor.\n");
    for(i=0;i<n;i++){
        printf("Vetor [%d]: ", i);
        scanf("%d", &vet[i]);
    }
}
void imprimir(int *vet, int n){
    printf("\n\nO vetor é o seguinte.\n");
    int i;
    for(i=0;i<n;i++){
        printf("Vetor [%d]: %d.\n", i, vet[i]);
    }
}
float media(int *vet, int n , int j){
    float somar=0, i=0;

    /*for(i=0;i<n;i++){
        somar += (*vet)++;
    }
    somar=somar/n;
    return somar;*/

   if(n==1){
        return vet[0]/n;
   }
   else{
        return (media(vet, n-1,j+1)+vet[j]/n);
   }
}

 

adicionado 22 minutos depois

 

 

Consegui....

...

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Para calcular um média aritmética; primeiro adiciono todas parcelas em uma soma, depois divido a soma pela quantidades de parcelas adicionadas. Porém ao que me consta o algoritmo que resolve dividir cada parcela e depois somar, ou seja. Dadas as parcelas n(a,b,c,d ... n-1) com n= número de parcelas. 

 

A média aritmética é ( a + b + c + d ... n-1 )*(1/n).

 

Daí o seu algoritmo aplica a distributiva na operação da seguinte maneira:

((a/n) + (b/(n-1)) + (c/(n-2) + (d/(n-3) ... ((n-1)/1)).  Ou seja, o denominador (n) decresce até 1.

Você entendeu isso com certo por quê?

 

Você me entendeu? Algo que querei dizer diga ...

O.k?

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC  Na verdade eu queria somar tudo primeiro e depois dividir pela quantidade. Mas nao estava dando certo.

 

Queria que ficasse igual ao codigo comentado. Ai decidir dividir cada termo e depois somar, mas nem assim deu certo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa As duas intensões estão corretas: 1- Tanto é valido adicionar e dividir quando 2-Dividir e adicionar; ou seja, são comutativas. Contudo, a recursividade é aplicado a segmento de código que se repete, no caso não é média a ser recursiva, e sim a função SOMA, segundo o fragmento abaixo.

 

3 horas atrás, Josesousa disse:

for(i=0;i<n;i++){
      somar += (*vet)++; 
}

 

 

 

Você entendi isso também? Está claro pra você ??

aguardando O.k!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Entao nao precisa se o codifo todo de forma recursiva nao né?

Essa é a minha maior dificuldade.

 

Fiz a funcao da seguinte forma:

return vet[n-1]/(float)j + media(vet, n-1,j);

 

adicionado 14 minutos depois

 

 

@AnsiC Não sei porque, mas nao estou conseguindo fazer o somatório dos valores do vetor.

 

Da seguinte forma esta muito errado? (depois disso eu dividiria a soma pela quantidade de números)

somar=somar+media(j,vet[j+1], n);

 

Tem alguma aritmetica de ponteiros? Pois quando tento fazer dentro da recursao mostra erro o tempo todo. Aí estou tentando somar os valores pelo indice, mas nao esta dando certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Sim, apenas aquela parte que se entende logicamente como uma iteração, neste caso a soma já é o bastante para maioria dos professores. Eu não consigo entender as suas linhas de código, fica difícil administra-las só com fragmentos, contudo, parece repetir a mesma fórmula anterior, com diferença no denominador que, não decresce como antes porque é uma constante dividindo cada elemento do arranjo. Porém, como já acordado, a recursividade é necessária apenas por otimização naquela parte de iteração no código; fica no caso restrito a função ´soma´, por hora. Se depois quiseres, pensas um pouco mais no segundo caso: dividir, e adicionar. Por enquanto pensei em: adicionar, e dividir.

 

Sim, nos planos da função ´soma´, usamos se quisermos apenas ponteiro.

Faça (implemente) apenas a função ´soma´, depois coloque-a como função internar à função ´media´.

 

"É tão simples" que faço o protótipo, deixo o corpo para você arriscar.

/** Percorre o arranjo do início até o fim retorna a soma de seus elementos.
	
    @param [in] iarray  ponteiro int: primeiro elemento do vetor.
    @param [in] farray  ponteiro int: último elemento do vetor.
    @return  a soma dos elementos do arranjo.
*/
float array_sum( const int *iarray, const int *farray );

*** está em inglês, só de elegância. 

 

Você entende isso também?

Está claro pra você ??
Aguardando O.k

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×