Obilczanie elementów ciągu na podstawie wzoru

0

Mam taki wzór na ciąg:

screen42.png

i nie bardzo wiem, jak to zapisac w kodzie - zrobilem 2 wersje, ale zadna z nich nie dziala :(

#include <stdio.h>
#include <stdlib.h>

int funa(int n)
{
    int Am = 0, i = 0;
    if(n == 0)
        Am = 1;
    else
    {
        while(i < n)
        {
            i++;
            if(i%2 == 0)
                Am = Am+Am*2;
        }
    }
    return Am;
}

int funb(int n)
{
    int Am = 0, i = 0;
    if(n == 0)
        return 1;
    else if(n%2 == 0)
    {
        return funb(n-1) + 2*funb(n);
    }
    else
        return funb(n);
}

int main(int argc, char **argv)
{
    printf("%d\n", funa(2));
    printf("%d\n", funb(2));

    return 0;
}

0

Ale przecież ty źle to liczysz. We wzorze masz co innego w a kodzie co innego. Przecież we wzorze masz napisane że:
a(2n) = a(2n-1) + 2 * a(n) ----> patrz na indeksy...
a(2n+1) = a(2n) ---> znów patrz na indeksy

A u ciebie w kodzie to jakieś cuda na kiju robisz. W pierwszej wersji bierzesz zupełnie inny wzór i nigdzie nie masz podwojonych indeksów. W drugiej wersji robisz ten sam błąd z indeksami a potem jeszcze dla nieparzystych robisz nieskończoną rekurencję bo nigdzie nie dałeś n-1...

0

Myślałem, że 2m to chodzi o parzystość n-a ... Ok, poprawiłem i nadal liczy źle (w sumie wcale):

 #include <stdio.h>
#include <stdlib.h>

int funa(int n)
{
    if(n == 0)
        return 1;
    else if(n%2 == 0)
    {
        return funa(2*n-1) + 2*funa(n);
    }
    else
        return funa(2*n);
}

int main(int argc, char **argv)
{
    printf("%d\n", funa(2));

    return 0;
}

0

Bo ty po prostu nie umiesz czytać albo jesteś głupi, nie wiem co gorsze... Masz napisane jak byk:
a(2n+1) = a(2n)
czyli:
a(2n) = a(2n-1)
czyli
a(n) = a(n/2 -1 )
U ciebie w kodzie nigdzie takiego wywołania nie widzę. Zamiast tego widzę a(n) = a(2n) co jest totalnie bez sensu
Znów we wzorze jest napisane wyraźnie:
a(2n)=a(2n-1) + 2a(n)
czyli
a(n) = a(n-1) + 2
(n/2)
A u ciebie w kodzie zamiast tego widzę a(n) = a(2n-1) + 2*a(n)
Widzisz różnicę? ;]

0

dziekuje, juz jest ok. Jak moglbym kiedys "wpasc" na to, zeby to po prostu uproscic? ;)

0
unsigned func(unsigned n)
  {
   return n?(n&1?func(n-1):2*func(n>>1)+func(n-1)):1;
  }

lub:

unsigned funq(unsigned n)
  {
   n>>=1;
   return n?2*funq(n)+funq((n<<1)-1):1;
  }

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