aula 299

Dúvida | Como fazer uma função recursiva para calcular a média dos pares de um vetor?

Nesta aula, respondendo a uma dúvida, vamos aprender uma forma de implementar uma função recursiva para calcular a média dos números pares de um vetor de inteiros.

Para calcular qualquer média, além da soma dos elementos, também precisamos saber quantos elementos foram somados para realizar a divisão. Como o objetivo é uma função recursiva que vai trabalhar com um vetor, também precisamos do vetor e do tamanho do vetor. Assim, precisamos receber quatro parâmetros:
– o vetor;
– o tamanho do vetor;
– a soma dos pares, que no início será zero, e
– o total dos pares, que no início também será zero.

Assim, teremos a seguinte assinatura para nossa função recursiva:

/*
       Assinatura da nossa função
*/
float mediaPares(int vet[], int tam, int soma, int quant);

Agora precisamos desenvolver o corpo da nossa função, a parte que irá de fato calcular a média dos números pares. Para fazer isso precisamos percorrer todas as posições do nosso vetor, mas lembre-se que queremos usar recursão e não uma repetição do tipo for. Assim, podemos usar a variável com o tamanho do vetor para esse acesso, subtraindo 1 em cada chamada recursiva, até chegar em zero.

Usando a estratégia sugerida no parágrafo acima, o nosso ponto de parada é o zero. Este é o primeiro teste que faremos. Se o tamanho do vetor for zero, significa que já percorrermos todo o vetor, basta agora calcular e retornar a média. Esta ideia é apresentada no trecho de código a seguir.

Como estamos somando valores inteiros e dividindo por um valor inteiro, o resultado também será inteiro. Para termos o resultado real com a parte decimal, basta transformar uma das partes em um valor decimal, por isso estamos multiplicando a soma por 1.0.

/*
      Função para calcular a média dos pares de um vetor - parte I
*/

float mediaPares(int vet[], int tam, int soma, int quant){
    if(tam == 0)
        return (soma * 1.0) / quant;
    else{
        // continuação com as chamadas recursivas
    }
}

E quando o tamanho do vetor for maior que zero? Significa que ainda não passamos por todos os elementos do vetor. Neste caso, precisamos verificar se o valor da posição tamanho é par. Se for par, então acumulamos esse valor na variável soma e contamos mais 1 na variável quantidade de pares ao fazer uma nova chamada recursiva subtraindo 1 do tamanho do vetor. Caso contrário, apenas fazemos uma chamada recursiva subtraindo 1 do tamanho do vetor.

Esta lógica é apresentada no trecho de código a seguir.

/*
      Função para calcular a média dos pares de um vetor - parte II
*/

float mediaPares(int vet[], int tam, int soma, int quant){
    if(tam == 0)
        return (soma * 1.0) / quant;
    else{
        if(vet[tam - 1] % 2 == 0) // é par?
            return mediaPares(vet, tam - 1, soma + vet[tam - 1], quant += 1);
        else // não é par
            return mediaPares(vet, tam - 1, soma, quant);
    }
}

A seguir temos o código completo em C com a função principal exemplificando a utilização da função que acabamos de implementar.

Código completo em C

#include <stdio.h>
#include <stdlib.h>

/*
         Código escrito por Wagner Gaspar
         Novembro de 2021
*/

float mediaPares(int vet[], int tam, int soma, int quant){
    if(tam == 0)
        return (soma * 1.0) / quant;
    else{
        if(vet[tam - 1] % 2 == 0)
            return mediaPares(vet, tam - 1, soma + vet[tam - 1], quant += 1);
        else
            return mediaPares(vet, tam - 1, soma, quant);
    }
}

int main(){

    int vet[6] = {2,4,38,7,11,9};

    printf("Media dos pares: %f\n", mediaPares(vet, 6, 0, 0));

    return 0;
}

Deixe um comentário

13 + treze =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.