Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
↑ lander:
Toto jsem pred davnem resil. Existuji 2 zpusoby jak to naprogramovat (1) rekurzivne - docela slozite pro tenhle pripad nebo (2) smyckami
Umim jen c++, tak ti to napisu v tom
#include <iostream>
int pocitej(int pozice);
using namespace std;
int main()
{
int vysledek,pozice = 83;
vysledek = pocitej(pozice);
cout <<"Fibonacciho cislo je" << vysledek;
return 0;
}
int pocitej(int x)
{
int minusDruhy = 1, minusPrvni = 1, vysledek = 1;
if ( x < 3)
return 1;
for ( x -= 3; x; x--;)
{
minusDruhy = minusPrvni;
minusPrvni = vysledek;
vysledek = minusPrvni + minusDruhy;
}
return vysledek;
}
Offline

↑ piiity:
Jseš si jistý, že ti to funguje správně?
Offline
Existují 3 způsoby výpočtu:
1) rekurzivně - pomalé
int Fib(int cislo)
{
if(cislo < 3) // 1 a 2
return 1;
else
return Fib(cislo-1)+Fib(cislo-2); // rekurzivně spočítá předchozí dvě fib. čísla, která se také spočítají rekurzivně atd...
}
2) pamatuji si vždy 2 předchozí Fibonaciho čísla, pomocí nich vytvořím třetí
int c1=1, c2=1, c3;
for(int i=3; i<=hledane_cislo; i++)
{
c3 = c1+c2; // výpočet dalšího fib. čísla
c1 = c2;
c2 = c3; // tyto 2 řádky zajišťují přesun hodnot proměnných, ve kterých jsou hodnoty posledních 2 fib. čísel
}
po výpočtu bude v c2 i c3 hledaná hodnota fib. čísla
3) nejrychlejší je použít vzorec na výpočet n-tého fib. čísla, který se dá získat diferenčními rovnicemi, nelekněte se těch odmocnin (sqrt):
int Fib = (((1+sqrt(5))/2)^N-((1-sqrt(5))/2)^N)/sqrt(5)
odkaz na vzorec: http://sustek.wz.cz/vzorce/004.png
Offline
↑ gladiator01:
Omlouvám se skutečně tam byly chyby.
#include <iostream>
double pocitej(int pozice);
using namespace std;
int main()
{
double vysledek;
int pozice;
cout << "Zadejte pozici: ";
cin >> pozice; //zadani pozice
vysledek = pocitej(pozice); //tato hodnota se preda funkci pocitej
cout <<"Fibonacciho cislo je" << vysledek; //vypise vysledek
system("PAUSE");
return 0;
}
double pocitej(int x)
{
double minusDruhy = 1, minusPrvni = 1, vysledek = 2; //nastaveni pocatecnich hodnot
if ( x < 3) // testovani jestli je x mensi jak 3, tak vrati vysledek 1
return 1;
for ( x -= 3; x; x--)
{
minusDruhy = minusPrvni;
minusPrvni = vysledek;
vysledek = minusPrvni + minusDruhy;
}
return vysledek;
}pocatecni pozice: minusDruhy a minusPrvni = 1 a jako odpoved je logicky 2, potom ve for smycce snizime hodnotu x o "-3", protoze prvni dve cisla uz zname z pocatecni pozice. Pro kazde cislo pak postupuje tak, ze vlozime hodnotu minusPrvni do minusDruhy a hodnotu vysledeku do minusPrvni. Novy vysledek je pak soucet techto cisel a zaroven se snizi x o "1". Takhle pokracujeme dokud nedosahne x "0". Potom zobrazi odpoved.
Vyuzival jsem vzorec na http://www.math.rutgers.edu/~erowland/fibonacci.html , kde si take muzete zkontrolovat spravnost odpovedi.
Edit: zmena int na double
Offline

Nejjednoduší bude tedy asi použít ten vzorec: Zadáš toto:
N=83 vysledek=((1+sqrt(5))^N-((1-sqrt(5))^N))/((2^N)*sqrt(5))
Zkus to, já teď nemam k dispozici matlab, ale je to tak primitivní, že by to mnělo fungovat.
Nebo zkusím přepsat některý z předchozích postupů.
Offline
Stránky: 1