W jaki sposób utworzyć funkcję iteracyjną dla:
liczb parzystych:
An = 2 * A(n+1)
liczb nieparzystych
An = A(n-1) / 3
W rekurencji te funkcje nawzajem siebie wywołują w zależności od tego, czy liczba jest parzysta, czy nie.
A jakis warunek początkowy to co? Mam sobie wymyślić? o_O?
To jest funkcja okreslona dla LICZB parzystych i nieparzystych czy WSPÓŁCZYNNIKÓW (n) parzystych i nieparzystych? Zakładam ze to drugie...
Czasem sie nie pomyliłeś ?
Jak An = 2*A(n+1) ? To A(n+1) to sobie mam wyczarować? Może miało być A(n-1) ?
Zakładam że :
An = 2 * A(n-1) dla n parzystych
An = A(n-1) / 3 dla n nieparzystych
A0 = 1
double A(int n)
{
double wynik = 1; warunek poczatkowy
for(int i=1;i<n;i++)
{
if(!(i%2)) //parzysta
wynik *= 2;
else
wynik /= 3;
}
return wynik;
}
Shalom napisał(a)
A jakis warunek początkowy to co? Mam sobie wymyślić? o_O?
Gdy wartość jest równa 1 to oznacza koniec.
Shalom napisał(a)
Czasem sie nie pomyliłeś ?
Nie pomyliłem się.
Jak An = 2*A(n+1) ? To A(n+1) to sobie mam wyczarować? Może miało być A(n-1) ?
Nie, A(n+1).
A0 podaje się na wejściu.
Pierwszy wiersz na wyjściu podane liczbę N dla której równanie wynosi 1, a drugi wartości wszystkich elementów od n do 0.
Tutaj rozwiązanie z zastosowaniem rekurencji:
#include <cstdio>
using namespace std;
typedef unsigned short int uint;
uint A0, N;
void fun(uint);
int main()
{
scanf("%u", &A0);
fun(A0);
printf("%u", A0);
return 0;
}
void fun(uint An)
{
if (An != 1)
{
N++;
if (An%2 == 0)
{
fun(An>>1);
printf("%u ", An>>1);
}
else
{
fun((3*An)+1);
printf("%u ", (3*An)+1);
}
}
else
printf("%u\n", N);
}
@Adam.chyla,
Niektórzy ludzie zadziwiają mnie nieumiejętnością zadawania pytań.
@Adam.chyla w kodzie masz napisane:
A(n+1) = fun((3*An)+1);
a nam podałeś:
An = A(n-1) / 3
Widzisz różnicę między tymi zapisami? KOLOSALNĄ różnicę?...
Dodatkowo podając nam drugi warunek też się pomyliłeś, bo zamiast A(n+1) miało tam być w takim razie A(n-1)
int A(int a0)
{
int i = 0;
while(a0 != 1)
{
i++;
if(!(a0%2)) //parzysta
a0 /= 2;
else
a0 = a0*3+1;
}
return i ;
}
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.