Funkcja iteracyjna

0

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.

0

No fucking sense....
An=2A(n+1) jak juz teraz mozesz znac wartosc nastepnego elementu? Musisz to zamienic na...
A(n-1)=2
An Ale to oczywiscie bedzie pozbawione sensu bo wpadniesz w niskonczona petle.

0

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;
}
0
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);
}
0

@adam.chyla,

  1. bardzo niestarannie (i nieprawdziwie) sformułowałeś pytanie. Powinno ono wyglądać tak:
    A(n)/2 jeśli A(n) jest parzyste
    A(n+1) =
    3*A(n)+1 jeśli A(n) jest nieparzyste
  2. Warunek zakończenia (A(n)==1) jest dosyć niepewny, tzw. hipoteza Collatza mówi, że niezależnie od wyrazu początkowego A(0) osiągniemy 1, hipotezy tej nie udowodniono.
0

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 ;
}
0

@Shalom, wzory są błędnie napisane to jedno, a druga wada pytania jest taka, że nie wiadomo parzystość której liczby należy sprawdzać.

0

Przepraszam was bardzo Panowie za nieprecyzyjne pytanie.
Dzięki za odpowiedź.

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