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; }