paulo1205
(usa Ubuntu)
Enviado em 13/08/2023 - 03:54h
Seu programa original (a não ser que você tenha editado a postagem ao longo do tópico) “funcionou” de primeira aqui para mim.
O problema que ele tinha, no entanto, era que você sempre calculava a razão dividindo o primeiro elemento do
array pelo segundo (i.e. “
razao = ((double)fibNum[0 ] / (double)fibNum[1 ]); ”), em lugar de ir aprimorando a qualidade da convergência com novos valores da sequência para cálculo da razão.
Suspeito que o que você queria era algo como o seguinte.
#include <cmath>
#include <iostream>
using namespace std;
int main() {
// razao = 21/34
// razao = 0.617;
double razao;
int anterior, atual, proximo;
int fibNum[] = {21, 34, 55, 89, 144, 233, 377, 610};
int tam = (sizeof(fibNum) / sizeof(fibNum[0]));
for (int i = 1; i < tam; i++) {
razao = ((double)fibNum[i-1] / (double)fibNum[i ]); // <-- Note que, aqui, a razão vai sendo aprimorada a cada novo número.
anterior = round(fibNum[i ] * razao);
atual = round(anterior / razao);
proximo = round(fibNum[i ] / razao);
cout
<< "\nAnterior: " << anterior
<< "\nAtual: " << atual
<< "\nProximo: " << proximo
<< "\nRazão: " << razao << endl
;
}
return EXIT_SUCCESS;
}
Note, porém, que o que se costuma considerar como razão para a sequência de Fibonacci, também conhecida como “razão áurea”, “razão de ouro” ou “número de ouro”, é
F(n)/F(n-1) , que é exatamente o inverso do que você fez (
F(n-1)/F(n) ).
A razão áurea é representada pelo símbolo φ (letra grega minúscula
phi , que corresponde a U+03C6 no Unicode), e corresponde ao valor
(1+√5)/2 (em C++,
(1.0+std::sqrt(5.0))/2.0 ), que é aproximadamente igual a
1,61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475 (cf.
https://oeis.org/A001622 ).
Uma versão do programa usando a razão áurea ficaria assim, portanto.
#include <cmath>
#include <iostream>
using namespace std;
int main() {
// phi = 34/21
// phi = 1.61904761904761904761;
double phi;
int anterior, atual, proximo;
int fibNum[] = {21, 34, 55, 89, 144, 233, 377, 610};
int tam = (sizeof(fibNum) / sizeof(fibNum[0]));
for (int i = 1; i < tam; i++) {
phi = ((double)fibNum[i ] / (double)fibNum[i-1]);
anterior = round(fibNum[i ]/phi);
atual = fibNum; //round(anterior*phi);
proximo = round(fibNum[i[i] ]*phi);
cout
<< "\nAnterior: " << anterior
<< "\nAtual: " << atual
<< "\nProximo: " << proximo
<< "\nRazão: " << phi << endl
;
}
return EXIT_SUCCESS;
}
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)