Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

N-ty wyraz ciągu Fibonacciego.

Ostatnio zmodyfikowano 2016-12-11 22:01
Autor Wiadomość
wokub
Temat założony przez niniejszego użytkownika
N-ty wyraz ciągu Fibonacciego.
» 2016-12-11 21:02:23
Siamka. Mam do zrobienia zadanie, w którym poprzez wzór rekurencyjny (wymagane) mam określić wartość 45. elementu ciągu Fibonacciego. Jest tego dużo na internecie, jednak zostało podkreślone, że wykonanie tego w inny sposób będzie lepiej postrzegane. Dlatego chciałbym się spytać, czy ktoś jest w stanie powiedzieć mi, co napisałem nie tak w tym kodzie? Bez wysyłania nowego całego zadania, ściągniętego z internetu. Interesuje mnie ten konkretny napisany przeze mnie kod. Z góry wielkie dzięki.

C/C++
#include<iostream>
#include<math.h>
#include<cstdlib>

int ciagFibonacciego( int n )
{
    if( n == 0 )
         return 0;
   
    if( n == 1 )
         return 1;
   
    return ciagFibonacciego( n - 1 ) + ciagFibonacciego( n - 2 );
}

int main()
{
    int n = 45;
    int ciag;
   
    ciag = ciagFibonacciego( n );
   
    std::cout << " 45. wyraz ciagu Fibonacciego ma wartosc: " << ciag << std::endl;
   
   
    std::cin.get();
    return 0;
}

Zresztą teraz przeszukałem internet (czego próbowałem uniknąć) i zauważyłem, że pierwszy lepszy kod na internecie wygląda tak:
C/C++
#include<iostream>
#include<cstdlib>
using namespace std;

int fib( int n )
{
    if( n < 3 )
         return 1;
   
    return fib( n - 2 ) + fib( n - 1 );
}

int main()
{
   
    int n;
   
    cout << "Podaj nr wyrazu ciągu: ";
    cin >> n;
   
    cout << n << " wyraz ciągu ma wartość " << fib( n ) << endl;
   
    system( "pause" );
    return 0;
}

Ciut podobnie do mojego. Czy da się to napisać jakoś bardziej oryginalnie czy jest to jedyna możliwość? Oczywiście pomijając jakieś super-zaawansowane kody. Zresztą wypróbowałem ten kod (drugi) i wyświetla n = 20 np, ale 45 już nie. Może to w tej liczbie jest problem.
P-154789
wokub
Temat założony przez niniejszego użytkownika
» 2016-12-11 21:35:16
Aktualizacja:
C/C++
#include<iostream>
#include<math.h>
#include<cstdlib>

int ciagFibonacciego( int n )
{
    if( n == 0 )
         return 0;
   
    if( n == 1 )
         return 1;
   
    return ciagFibonacciego( n - 1 ) + ciagFibonacciego( n - 2 );
}

int main()
{
    int ciag;
    int n = 20;
   
    ciag = ciagFibonacciego( n );
   
    std::cout << " 45. wyraz ciagu Fibonacciego ma wartosc: " << ciag << std::endl;
   
   
    std::cin.get();
    return 0;
}

Mój kod działa przy liczbie 20. Co zrobić, by działał przy 45? Jakiś inny format niż int?


Temat do zamknięcia. Kod działa, po prostu długo liczy (15 sekund)
P-154790
mateczek
» 2016-12-11 22:01:28
Ten algorytm jest zrąbany na maxa. Jeśli wklepałem 45 czekałem z minute a dla 60 to już chyba z 10 mintut mi liczy. To jest idealny przykład jak można zarąbać na śmierć komputer w sumie prostymi obliczeniami :) heheh

C/C++
#include<iostream>
#include<cstdlib>
using namespace std;

unsigned long long fib( int n )
{
    if( n < 3 )
         return 1;
   
    return fib( n - 2 ) + fib( n - 1 );
}

unsigned long long fib2( int n )
{
    static unsigned long long n_2 = 1;
    static unsigned long long n_1 = 1;
    static unsigned long long index = 2;
    unsigned long long act = n_2 + n_1; // aktualny wyraz ciągu. n_1 - poprzedni. n_2 - jeszcze starszy
    index++;
    if( index == n ) return act; //warunek końca obliczeń
   
    n_2 = n_1; //przesuwanie ciągu
    n_1 = act;
    fib2( n ); //kolejna iteracja wywołanie rekurencyjne
}

int main()
{
   
    int n;
   
    cout << "Podaj nr wyrazu ciągu: ";
    cin >> n;
   
    cout << n << " wyraz ciągu ma wartość " << fib2( n ) << endl;
    cout << n << " wyraz ciągu ma wartość " << fib( n ) << endl;
    return 0;
}
P-154793
« 1 »
  Strona 1 z 1