Estou usando o livro Introdução à Ciência da Computação, de John Zelle, e no final do Capítulo 3 (Computando com números), me pedem para encontrar o enésimo termo de uma sequência de Fibonacci, presumivelmente usando um loop for definitivo, como nenhuma outra decisão estrutura foi introduzida ainda.
Isso é possível? Eu tentei tudo o que pude pensar.
** Eu sei como resolvê-lo usando declarações if e tal. Mas o livro ainda não abordou estruturas de decisão, mas pede-me para encontrar o enésimo termo (fornecido pelo usuário). Portanto, só posso presumir saber como fazer isso usando loops "for", pois isso é tudo o que foi abordado até agora
if
instruções movendo as expressões condicionais para loops, mas isso seria apenas um truque completamente inútil, IMHO.Respostas:
Se for apenas o terceiro capítulo, duvido que os autores tenham abordado a programação dinâmica, mas ilustrarei o que está acontecendo quando um loop for é usado para calcular onº Número de Fibonacci, Fn .
Lembre-se da definição,
Poderíamos computar ingenuamente isso usando uma função recursiva definida em Python como,
No entanto, recalculando o mesmo subproblema várias vezes, essa função exige tempo exponencial para a computação (ilustrada abaixo)!
Há uma correção, no entanto. Podemos usar a programação dinâmica para fazer recursões "mais inteligentes" e manter os resultados anteriores por perto. Dessa forma, não precisamos recalcularFEu . Nossa chamada de função "árvore" entrará em colapso em uma lista e calcularáFn do "de baixo para cima".
Agora nós temos nossaO ( n ) algoritmo de tempo para calcular Fn , mas se você perceber, exigimos O ( n ) espaço adicional (um ponto na matriz para cada FEu ) Isso pode ser reduzido paraO ( 1 ) espaço adicional porque cada FEu requer apenas dois outros números de fibonacci, a saber Fi - 1 e Fi - 2 .
fonte
Se você precisar usar apenas um loop for que itera até encontrar o n-ésimo número de Fibonacci, use algo como isto:
NOTA
Na solução acima, presumo que a sequência de Fibonacci seja 1 1 2 3 5 8 13 ... e que n tenha o intervalo 1, 2, 3, ... Visto que nessas suposições, não há número de Fibonacci para n <1 , a função retorna um 0 para n <1 para indicar que o parâmetro de entrada está fora da faixa (consulte as sugestões de Tom nos comentários abaixo).
fonte