Recursividade em C

Júlia Gonzaga
3 min readAug 25, 2022

--

Uma função recursiva é uma função que chama ela mesma durante a sua execução.

  • Função recursiva direta: chama ela mesma dentro da própria função;
  • Função recursiva indireta: chama a si mesmo por meio de outra função;

O melhor exemplo de recursividade é através do cálculo de fatorial e essa operação é representada pelo símbolo de “!” . Para encontrar o fatorial de um número utilizamos a fórmula a seguir:

n! = n* (n-1) * (n-2) * … * 1

Obs: 1! e 0! (Fatorial de 1 e de 0) são iguais a 1.

Assim, vamos calcular o fatorial de 5. Exemplo: 5! = 5 * 4 * 3 * 2 * 1 = 120.

Note que o fatorial é uma sequência de operações semelhantes, multiplicações cada vez mais básicas até chegar em 1 (a sequência sempre é finalizada em 1).

Segue abaixo um código com uma função recursiva que calcula o fatorial de um número inteiro em C:

Outro exemplo de caso que envolve uma sequência de operações semelhantes é a série de Fibonacci. Portanto, podemos solucioná-la utilizando recursão.

A série de Fibonacci inicia com 0 e 1 e cada número subsequente é a soma dos dois números anteriores a ele. É uma série que acontece na natureza e descreve uma forma de espiral. Segue o exemplo abaixo:

Sequência de Fibonacci = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34…

Obs: Pense nessa sequência como se fosse um vetor, ou seja, começando sempre pelo índice 0. Por exemplo: o Fibonacci (3) é o 2, o Fibonacci (4) é o 3 e assim em diante.

É importante notar que o Fibonacci(0) sempre será igual a 0 e o Fibonacci(1) sempre será igual a 1. Uma vez que, a sequência sempre começa por 0 e 1:

  • Fibonacci(0) = A soma dos dois números anteriores ele é 0, visto que não há números antes do 0. Portanto, Fibonacci(0) = 0 + 0 = 0;
  • Fibonacci(1) = A soma dos dois números anteriores é 1, visto que temos 0 e 1 como antecedentes. Portanto, Fibonacci(1) = 0 + 1 = 1;

A seguir, segue a fórmula para o cálculo de Fibonacci dos números diferentes de 0 e 1:

Fibonacci(n) = Fibonacci(n - 1) + Fibonacci(n - 2 )

Segue abaixo, o exemplo de código que calcula o FIbonacci de um número em C:

Por último, temos um exemplo de como somar todos os valores de um vetor de inteiros através de uma função recursiva.

Para compreender melhor o exemplo abaixo, pense em um vetor de 3 números, de tamanho 2.

  • Linha 3 ->” int soma(int v[], int tam)” = É passado como parâmetro pra função soma o vetor = {1,2,3} e o tamanho 3. Obs: estamos diminuindo um elemento para o tamanho real na linha 7, o tamanho real do vetor é 2, visto que começa com o indice 0.
  • Linha 4 e 5 -> “if(tam == 0){return 0;}” = Se o vetor tiver 0 elementos, a soma retornará 0.
  • Linha 6 -> “else{ return v[tam — 1] + soma(v, tam — 1);}” = Se não, retorne a posição do vetor equivalente a v[tam -1], no nosso caso seria v[3 -1] = v[2] = 3. Apenas para melhor compreensão guarde esse valor 3 em sua memória.
  • Linha 6 -> soma(v, tam — 1); = É chamada a função soma de forma recursiva, passando o vetor inteiro, isto é, v{1,2,3} e tam-1 para a função.
  • Linha 6 -> “else{ return v[tam — 1] + soma(v, tam — 1);} ”Entra novamente no se não e agora o tam é 2, portanto v[tam -1] = v[2–1] = v[1] = 2. Portanto vamos somar esse valor com o valor guardado em sua memória anteriormente. 3 + 2 = 5.
  • Assim, esse loop se repetirá novamente até que seja efetuado 3 + 2 + 1 = 6, isto é, a soma de todos os valores do vetor. Repare que ele está somando esses elementos de trás para frente. A função funcionará da mesma forma com um vetor de n elementos.

Tente pensar em como a função acontece de forma simultânea para que assim, armazene os devidos valores e chegue no resultado final.

Referências

Canal Bóson Treinamentos, Lógica de Programação - Recursividade - 30. https://www.youtube.com/watch?v=M7c-m2xN9FQ

Programiz, C Recursion -https://www.programiz.com/c-programming/c-recursion

Canal Programe seu futuro, Curso de Programação C | Como somar os elementos de um vetor com recursão? | Aula 161 -https://www.youtube.com/watch?v=TgOQRIb_4CA

--

--

Júlia Gonzaga
Júlia Gonzaga

Written by Júlia Gonzaga

Software Engineer, interested in Computing, Design and communication - Brazil - UFOP.

No responses yet