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