algorytm w forze - co czwarty wyraz + reszta

0

witam,

potrzebuje wygenerowac w nastepujacy sposob wektor danych:

argument funkcji jest jeden i jest to liczba naturalna n.

podaje jak maja byc wyliczane kolejne wyrazy-elementy wektora:

a1 = n
a2 = 3n + 1
a3 = a2/2
a4 = a3/2
a5 = a4/2
a6 = 3
a5 + 1
a7 = a6/2
a8 = a7/2
a9 = a8/2
a10 = 3*a9 + 1
a11 = a10/2
...

czyli jak widzimy dokladnie od drugiego wyrazu ciagu co czwarty wyraz stosujemy (3*A_n-1) + 1, a w pozostalych wypadkach (A_n-1) / 2..

moj pomysl byl taki ze w ogole zaczynamy petla for od drugiego wyrazu ciagu i co cztery "kroki" bierzemy nastepny wyraz...no ale nie tak latwo to zrobic....

akurat to rozwiazuje w MATLABIE, wiec ponizej kod, jaki wypocilem:

 
c(1) = n;
x(2) = 3*n+1;
 for i = 2:n
     if mod(i,2) == 0 || % tu jeszcze trzeba dopisac jakis warunek na to zeby bral nie tylko parzyste ale i dokladnie "co czwarta" liczbe
         c(i) = 3*c(i-1) + 1;
     else
         c(i) = c(i-1)/2;
     end
 end

jednak chyba sie tego nie dal zrobic w jednym for'ze....

0

if mod(i,4) == 0 ?

0

nie bardzo.

dla i = 2, 6, 10, 14, 18, ... ma wybrac wyliczenie c(i) = 3*c(i-1) + 1

natomiast dla i = 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, ... ma wybrac c(i) = c(i-1) / 2

czy da sie to zapisac w jednej petli albo jakos prosto ? bo ja doszedlem tylko do tego, co mam w kodzie wyzej

0

if mod(i,4) == 2

0
f=[3 1;0.5 0;0.5 0;0.5 0];
c(1)=n;
for i = 2:n 
    c(i)=f(1+mod(i+2,4),:)*[c(i-1);1];
end

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