Estrutura de Dados
  • Programação e Estrutura de Dados
  • Estrutura de Dados
    • 1. Vetores e Matrizes
      • Vetores
      • Matrizes
      • Listas de Exercícios
    • 2. Listas Lineares
      • Lista Encadeada Simples
      • Lista Duplamente Encadeada
    • 3. Pilhas
      • Visão Geral
      • Operações
        • Criação de Pilhas
        • Inserção de elementos
        • Remoção de elementos
        • Impressão, topo e tamanho da pilha
      • Exemplo
    • 4. Filas
      • Visão Geral
      • Operações
        • Criação das Filas
        • Inserção de Elementos
        • Remoção de Elementos
        • Impressão, inicio e final da fila
      • Exemplo
    • 5. Recursividade
      • Visão geral
      • Exemplos
        • Execução do Algoritmo de Fibonacci Recursivo
    • 6. Algoritmos de Busca
      • Busca Sequencial
      • Busca Binária
      • Exemplos
    • 7. Algoritmos de Ordenação
      • Ordenação
      • Bubble Sort
      • Selection Sort
      • Insertion Sort
      • Merge Sort
      • Quicksort
    • 8. Árvores
      • Introdução
      • Árvores Binárias
      • Árvores Binárias de Busca
      • Árvores AVL
    • 9. Indexação e Hashing
    • 10. Grafos
  • Programação Orientada a Objetos
    • 1. Introdução a Orientação a Objetos
Powered by GitBook
On this page
  • Passo 1
  • Passo 2
  • Passo 3
  • Passo 4
  • Passo 5
  • Passo 6
  • Passo 7
  • Passo 8
  • Passo 9
  • Passo 10
  • Passo 11
  • Passo 12
  • Passo 13
  • Passo 14
  • Passo 15
  • Passo 16
  • Passo 17
  • Passo 18
  • Passo 19
  • Passo 20
  • Passo 21
  • Passo 22
  • Passo 23

Was this helpful?

  1. Estrutura de Dados
  2. 5. Recursividade
  3. Exemplos

Execução do Algoritmo de Fibonacci Recursivo

PreviousExemplosNext6. Algoritmos de Busca

Last updated 4 years ago

Was this helpful?

Vamos considerar como exemplo a implementação do algoritmo de Fibonacci de maneira recursiva:

def fibonacci(n: int) -> int:
  if n <= 1:
    return n
  else:
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(5))

A memória no computador possui um endereço e um valor. Para fins didáticos, vamos supor que esta memória seja sequencial, iniciando no endereço 0x01 e que possui uma etiqueta, referente ao nome da variável:

inserir a descrição da imagem aqui

O programa irá executar a última linha do código, reservando um espaço na memória para a variável e definido o retorno da função como sendo seu valor:

resultado = fibonacci(5)

Na memória fica:

Passo 1

Para saber qual valor de fibonacci(5), a função fibonacci é executada:

  1. A função fibonacci é chamada com parâmetro n = 5;

  2. Verifica-se se n é menor ou igual a 1. Falso, executa o else;

  3. Retorne o valor de fibonacci(4) + fibonacci(3);

Ou seja, o valor de fibonacci(5) será fibonacci(4) + fibonacci(3). Então na memória, ficaria:

Passo 2

Então, o programa irá tentar primeiro calcular o valor de fibonacci(4), pois a expressão é analisada da esquerda para a direita:

  1. A função fibonacci é chamada com parâmetro n = 4;

  2. Verifica-se se n é menor ou igual a 1. Falso, executa o else;

  3. Retorne o valor de fibonacci(3) + fibonacci(2);

Ou seja, o valor de fibonacci(4) será fibonacci(3) + fibonacci(2). Então na memória, ficaria:

Passo 3

Então, para saber o valor de fibonacci(4), o programa precisa saber o valor de fibonacci(3) e fibonacci(2). Analisando da esquerda para a direita, primeiro é calculado fibonacci(3):

  1. A função fibonacci é chamada com parâmetro n = 3;

  2. Verifica-se se n é menor ou igual a 1. Falso, executa o else;

  3. Retorne o valor de fibonacci(2) + fibonacci(1);

Ou seja, o valor de fibonacci(3) será fibonacci(2) + fibonacci(1). Então na memória, ficaria:

Passo 4

A mesma lógica: para saber o valor de fibonacci(3), antes é necessário saber o valor de fibonacci(2) e fibonacci(1). Da esquerda para a direita, calcula-se o valor de fibonacci(2):

  1. A função fibonacci é chamada com parâmetro n = 2;

  2. Verifica-se se n é menor ou igual a 1. Falso, executa o else;

  3. Retorne o valor de fibonacci(1) + fibonacci(0);

Ou seja, o valor de fibonacci(2) será fibonacci(1) + fibonacci(0). Então na memória, ficaria:

Passo 5

Para calcular o valor de fibonacci(2) então é preciso de fibonacci(1) e fibonacci(0). Da esquerda para a direita, calcula-se primeiro fibonacci(1):

  1. A função fibonacci é chamada com parâmetro n = 1;

  2. Verifica-se se n é menor ou igual a 1. Verdadeiro;

  3. Retorne o valor de n (1);

Neste ponto, a recursividade é interrompida brevemente, pois o valor não depende mais de uma outra chamada da função. Assim, na memória fica:

Passo 6

Assim, tendo o valor de fibonacci(1), este é substituído em fibonacci(2):

Passo 7

Mas ainda é necessário calcular o valor de fibonacci(0):

  1. A função fibonacci é chamada com parâmetro n = 0;

  2. Verifica-se se n é menor ou igual a 1. Verdadeiro;

  3. Retorne o valor de n (0);

Então na memória fica:

Passo 8

Este valor é prontamente substituído no valor de fibonacci(2):

Passo 9

O valor de fibonacci(2) é obtido somando 1+0 = 1 e é substituído em fibonacci(3):

Passo 10

Para calcular o valor final de fibonacci(3) é preciso o valor de fibonacci(1) novamente, então é feito novamente a chamada:

  1. A função fibonacci é chamada com parâmetro n = 1;

  2. Verifica-se se n é menor ou igual a 1. Verdadeiro;

  3. Retorne o valor de n (1);

Ficando na memória:

Passo 11

Este valor é prontamente substituído em fibonacci(3), ficando:

Passo 12

O valor de fibonacci(3) então valerá 1+1 = 2, sendo substituído em fibonacci(4):

Passo 13

Mas novamente é preciso o valor de fibonacci(2), então:

  1. A função fibonacci é chamada com parâmetro n = 2;

  2. Verifica-se se n é menor ou igual a 1. Falso, executa o else;

  3. Retorne o valor de fibonacci(1) + fibonacci(0);

Ficando na memória:

Passo 14

Já sabemos que fibonacci(1) retornará 1 e fibonacci(0) retornará 0, então para simplificar, colocarei direto seus valores em fibonacci(2):

Passo 15

Ficando o valor de fibonacci(2) igual a 1+0 = 1, sendo prontamente substituído em fibonacci(4):

Passo 16

Assim, o valor de fibonacci(4) ficará igual à 2+1 = 3, sendo prontamente substituído em fibonacci(5):

Passo 17

Para calcular ainda o valor final de fibonacci(5) é necessário o valor de fibonacci(3):

  1. A função fibonacci é chamada com parâmetro n = 3;

  2. Verifica-se se n é menor ou igual a 1. Falso, executa o else;

  3. Retorne o valor de fibonacci(2) + fibonacci(1);

Ou seja, o valor de fibonacci(3) será fibonacci(2) + fibonacci(1):

Passo 18

Analisando da esquerda para a direita, novamente calcula-se o valor de fibonacci(2):

  1. A função fibonacci é chamada com parâmetro n = 2;

  2. Verifica-se se n é menor ou igual a 1. Falso, executa o else;

  3. Retorne o valor de fibonacci(1) + fibonacci(0);

Ficando na memória:

Passo 19

Como já sabemos, fibonacci(1) vale 1 e fibonacci(0) vale 0, então substituindo os valores:

Passo 20

Resultando em fibonacci(2) igual a 1+0 = 1, sendo prontamente substituído em fibonacci(3):

Passo 21

Falta ainda calcular o valor de fibonacci(1), que já sabemos que vale 1:

Passo 22

Assim, o valor de fibonacci(3) será 1+1 = 2, sendo prontamente substituído em fibonacci(5):

Passo 23

Finalmente, o valor de fibonacci(5) valerá 3+2 = 5, sendo substituído prontamente em resultado:

Portanto, quando for executado:

resultado = fibonacci(5)

O valor de resultado será 5. Valor este que pode ser comprovado executando o código.

inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui
inserir a descrição da imagem aqui