Zadanie z olimpiady programistycznej - nie potrafię zrozumieć wzoru (i tytułować wątków)

0

Robie zadania z pewnej olimpiady programistycznej i mam problem, nie potrafie zrozumieć tego wyrażenia:

user image

Mógłby mi ktoś podpowiedzieć, czy tu raczej mam się sam domyśleć jak to sie liczy czy raczej coś trzeba na ten temat wiedzieć.

0

przykladow, dla a0=0 i a,,1, = 1:
a2 = a1 + a2 = 1 + 0 = 1 (n = 2, czyli jest parzyste)
a3 = a2 - a1 = 1 - 1 = 0
...

1

Może ja pokaże całe zadanie XD
user image

0

Wzór można mocno uprościć, dla n nieparzystych an = an-3.
Poza tym, niewiele Ci pomogę, bo nie mogę sobie wyobrazić czego można nie rozumieć w tym wzorze.

2

masz DOKŁADNIE napisany algorytm rekurencyjny na n-ty wyraz ciągu. W czym jest problem?

0

Dobra już wiem o co chodzi XD popatrzyłem na przykłady pokazane na tej stronie i już wiem. http://www.algorytm.edu.pl/rekurencja-zadania/75-n-ty-wyraz-ciagu.html :P

0

Zapewne nie rozumiesz rekurencji..
Przykład w c++

int function(int n)
{
    int liczba;
    if(n == 0)
    {
        liczba = 2;
    }
    else if(n == 1)
    {
        liczba = 3;
    }
    else
    {
        if(n % 2 == 0)
        {
          liczba = function(n - 1) + function(n - 2);
        }
        else
        {
          //liczba = function(n - 1) - function(n - 2);
            liczba = function(n - 3);   // uproszczenie, które jest bardzo przydatne w przypadku rekurencji
        }

    }

    return liczba;
}
 
4

Moim zdaniem, pomysł użycia rekurencji jest w tym zadaniu absurdalny. Ciąg (pierwsze 76 wyrazów) należy stablicować.

#include<stdio.h>

int liczby[76];
int wyraz(int indeks)
{
    return liczby[indeks];
}
int main()
{

    liczby[0] = 2;
    liczby[1] = 3;
    for(int i=2;i<76;i++)
    {
        if(i % 2 == 0)
        {
            liczby[i] = liczby[i-1]+liczby[i-2];
        }
        else
        {
            liczby[i] = liczby [i-3];
        }
    }
    //dla kontroli
    for(int i=0;i<76;i++)
    {
        printf("%d\n",wyraz(i));
    }
    return 0;
}
3

Wariant anty-rekurencyjny (koszt pamięci sprowadzony do stałego):

http://ideone.com/tIBOqu

#include<stdio.h>

#define N 76

int main()
{
    int liczba_n; 
    int liczba_n2 = 2;
    int liczba_n1 = 3;

    if (N < 1)
       liczba_n = liczba_n2;
    else if (N == 1)
       liczba_n = liczba_n1;
    else
    for(int i=2;i<N;i++)
    {
        if(i % 2 == 0)
        {
            liczba_n = liczba_n1 + liczba_n2;
        }
        else
        {
            liczba_n = liczba_n1 - liczba_n2;
        }

        liczba_n2 = liczba_n1;
        liczba_n1 = liczba_n;
        printf("%d\n",liczba_n);
    }

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1