Enviar um café pro programador

Mostrando postagens com marcador Fibonacci. Mostrar todas as postagens
Mostrando postagens com marcador Fibonacci. Mostrar todas as postagens

Como gerar a Sequência de Fibonacci com listas e recursão

 Neste tutorial, vamos aprender como criar um algoritmo que gera uma lista, em Python, com os números da série de Fibonacci:

Exibir a sequência de Fibonacci

Código da Sequência de Fibonacci em Python

Sem mais delongas, vamos ao algoritmo:

  1. def fib(n):
  2.     f0, f1 = 0, 1
  3.     f = [1] * n
  4.     for i in range(1, n):
  5.         f[i] = f0 + f1
  6.         f0, f1 = f1, f[i]
  7.     return f
  8. num = int(input("Quantos termos gerar: "))
  9. print( fib(num) )

Diferente das outras vezes, que usamos o laço while e usando recursão com funções, dessa vez vamos usar listas.

Código comentado da Série de Fibonacci

Na linha 1, definimos a função fib(), que recebe um inteiro n, que é o número de termos que vamos gerar.

Os primeiros termos da série sempre são 0 e 1, armazenados nas variáveis f0 e f1.
E para os próximos termos? Bom, como teremos n termos, vamos criar uma lista f com n termos, isso foi feito na linha 3.

O próximo passo é aplicar nos próximos termos a regra da sequência de Fibonacci:
"Cada termo é a soma dos dois anteriores"

Como ja temos os termos f0 e f1, o próximo termo é a soma destes (linha 5).
Agora temos três termos: f0, f1 e f[i]

Na próxima iteração, o novo valor de f0 será o valor antigo de f1.
O novo valor de f1 será o valor anterior da lista f
E o novo valor da lista? É sempre a soma dos dois anteriores, que são f0 e f1.

  • Benchmarking do algoritmo

Vamos usar os comandos %timeit e %time para analisar o tempo e execução para achar uma lista com os 100 primeiros termos da Série de Fibonacci como nosso algoritmo:

Sequência de Fibonacci em Python

Veja que foram feitos 100.000 (cem mil!) loops, em poucos microssegundos! Ou seja, é um bom código.

Exercício:

Faça o mesmo benchmarking para o código usando apenas o laço while. E depois usando o código que usa apenas recursividade sem as listas.

E aí, qual deu melhor?

Gerar a Série de Fibonacci em Python (Recursividade)

Neste tutorial de nosso Curso de Python, vamos aprender como gerar a tão famosa sequência de Fibonacci, usando funções e recursão!

É um exercício resolvido de nossa lista de questões de funções.
Leia também:

Gerando a Sequência de Fibonacci em Python


A série de Fibonacci é uma sequência de números, cujos dois primeiros são 0 e 1. O termo seguinte da sequência é obtido somando os dois anteriores. Faça uma script em Python que solicite um inteiro positivo maior que 1 ao usuário, n. Então uma função exibe todos os termos da sequência até o n-ésimo termo. Use recursividade.

Vamos criar uma função chamada fibo( n ) que tem o parâmetro n.
O argumento que você deve passar para esta função é um inteiro positivo, maior ou igual a 2.

Como a série de Fibonacci é formada somando seus dois termos anteriores, sua fórmula geral é:
fibo(n) = fibo(n-1) + fibo(n-2)

Mas como toda boa função que usa recursividade, ele tem que ter um stop, pois uma hora ela vai ter que parar. Fazemos isso usando testes condicionais IF.

No nosso caso, vai ter dois stops.
Se o valor de n for igual 1, vamos retornar 0 (pois o primeiro termo é 0).
Se o valor de n for igual 2, vamos retornar 1 (pois o segundo termo é 1).

Pronto, para valores maiores que 2, basta somarmos os dois termos anteriores.

Agora vamos montar nossa função menu().
Ela pede o termo n ao usuário, que deve ser inteiro e maior que 2.

Agora ela deve imprimir na tela os valores de fibo(1), fibo(2), fibo(3)....até fibo(n).
Lembre-se, nossa função mostra o n-ésimo termo!

Então temos que imprimir todos, de 1 até n.

Fazemos isso usando um laço for, que vai de 1 até n (função range). 

E prontinho, vai exibir cada termo da sequência de Fibonacci, um por linha!

Danada essa função recursiva, não?



Código Python

Nosso código ficou assim:


def fibo(n):
    if n==1:
        return 0
    elif n==2:
        return 1
    else:
        return fibo(n-1) + fibo(n-2)
        
def menu():
    n = int(input('Exibir ate o termo (maior que 2): '))

    for val in range(1,n+1):
        print(fibo(val))
    
while True:
    menu()


Série de Fibonacci em Python - Como Fazer a Sequência

Neste tutorial, de nossa Apostila de Python, vamos te explicar o que é a famosa sequência de Fibonacci, como é formada e como fazer a sequência usando programação em Python.

Série de Fibonacci na Matemática

A série de Fibonacci nada mais é que uma sequência de números inteiros, formada por uma regrinha bem simples e fácil, algo aparentemente 'bobo', mas com um impacto e importância brutal na natureza.

A regra é a seguinte:
  • O primeiro número da série é 1
  • O segundo número da série é 1 também
  • O próximo número da série é sempre a soma dos dois anteriores


Vamos chamar de a1, a2, a3, ...., os termos da sequência de Fibonacci, eles são o seguinte:
a1 = 1
a2 = 1
a3 = a2 + a1 = 1 + 1 = 2
a4 = a3 + a2 = 2 + 1 = 3
a5 = a4 + a3 = 3 + 2 = 5
a6 = a5 + a4 = 5 + 3 = 8
a7 = a6 + a5 = 8 + 5 = 13
a8 = a7 + a6 = 13 + 8 = 21
a9 = a8 + a7 = 21 + 13 = 34
...

E por aí vai, ela é uma sequência infinita.

A Sequência de Fibonacci na Natureza

A parte mais interessante da sequência de Fibonacci, é sua aplicação e uso em nosso dia a dia, bem como sua presença na natureza.

Na Matemática, se usa para achar o MDC (máximo divisor comum) de dois números inteiros.
Pode ser usado na conversão de milhas para KM.

Há estudos e usos de Fibonacci na música (afinar instrumentos).

O animal Nautilus possui uma espiral em sua concha, formada por proporções de números da série de Fibonacci.


Série de Fibonacci em Python - Apostila


Nossos dentes, por exemplo, possuem larguras cuja proporcionalidade entre si obedece aos números da sequência.

Calcular Fibonacci com Python

As folhas da Bromélia são formadas por espirais, cujos raios pertencem a série.

É uma sequência tão importante, tão misteriosa e presente que tem gente que até estudar os números de Fibonacci para tentar ganhar na Mega Sena.


Calcular Elementos de Fibonacci em Python

Ok! Já vimos o que são os números de Fibonacci, agora vamos aprender a achar eles usando apenas programação em Python.

Vamos resolver uma questão de nossa Lista de Exercícios de Laços:

A série de Fibonacci é formada pela seqüência 1,1,2,3,5,8,13,21,34,55,... Faça um programa capaz de gerar a série até o n−ésimo termo.


Lógica da Programação Python

Antes de nossa lógica funcionar no código, ela precisa funcionar em nossa cabeça. Esse é o grande segredo de todo bom programador: a coisa precisa funcionar na sua mente antes de você começar a codar, ok?

Vamos chamar de n a variável que representa o n-ésimo termo da série, termo que o usuário vai fornecer.

Como temos sempre que somar os dois elementos anteriores, as variáveis para representar eles terão os nomes ultimo e penultimo. O n-ésimo termo vai ser armazenado na variável termo.

Agora vamos, com calma, te ensinar o pulo do gato.

Vamos pegar um situação que temos a seguinte configuração:
ultimo = 5
penultimo = 3

Logo, o próximo termo é:
termo = ultimo + penultimo = 8

Depois, na nova iteração do laço, nossos novos valores de ultimo e penultimo devem variar, ir pra frente na sequência de Fibonacci. Devem ser agora:
ultimo = 8
penultimo = 5

Ou seja, o novo valor de penultimo deve ser o valor antigo de ultimo:
penultimo = ultimo

E o novo valor de ultimo deve ser o próximo termo da sequência.
E como calculamos o próximo valor da sequência? Somando os dois valores anteriores, que é o valor antigo de ultimo com penultimo.

O novo valor de ultimo fica:
ultimo = ultimo + penultimo

Ou simplesmente:
ultimo = termo

Exercício resolvido com laço WHILE

Lembrando que se o usuário pedir o termo de número 1 ou 2, devemos retornar 1. Checamos isso com um IF retornando 1 caso o usuário digite 1 ou 2.

Só daí em diante que aplicamos a regrinha da soma dos valores anteriores, aí cai no ELSE, onde iremos fazer o código explicado pela lógica anterior.

A variável que vai ficar responsável pela contagem de iterações é a count.
Ela se inicia valendo 3, pois já temos os dois valores iniciais da sequência (1 e 1) e vamos calcular em seguida o terceiro termo.

Quando o laço WHILE acaba, damos o print da variável termo.
(tudo ainda dentro do ELSE)

Nosso código fica assim:

n = int(input("Que termo deseja encontrar: "))
ultimo=1
penultimo=1


if (n==1) or (n==2):
    print("1")
else:
    count=3
    while count <= n:
        termo = ultimo + penultimo
        penultimo = ultimo
        ultimo = termo
        count += 1
    print(termo)


Exercício resolvido com laço FOR

n = int(input("Que termo deseja encontrar: "))
ultimo=1
penultimo=1

if (n==1) or (n==2):
    print("1")
else:
    for count in range(2,n):
        termo = ultimo + penultimo
        penultimo = ultimo
        ultimo = termo
        count += 1
    print(termo)

PS: algumas fontes definem como 0 o primeiro termo, 1 o segundo termo e do terceiro em diante é a soma dos dois termos anteriores, que é uma definição diferente dos dados da questão. No fim das contas, isso não importa muito, pois a lógica é a mesma, só precisa de alguns pequenos ajustes.