Funkcja ciągu liczbowego

0

witam

potrzebowałbym pomocy z jednym zadaniem
Należy napisać funkcję, która dla liczby naturalnej n będzie wyznaczała, zgodnie ze wzorem i wyświetlała n kolejnych wyrazów takiego ciągu: a0 = 0, a1 = 1, an = 2(an-2 + an-1). UWAGA: n jest liczbą naturalną z przedziału (0, 121). W main pobrać n od użytkownika, następnie wywołać funkcję.

poki co moj kod wyglada tak
proszę o podpowiedź jak moglbym to zmienic

#include <stdio.h>

int function2(int n)
{
    if (n == 0) {
        return 0 ;
    }
    if (n == 1) {
        return 1 ;
    } else {
        return 2 * (function2(n - 2) + function2(n - 1));
    }
}
int main(void) 
{
int n;
    printf("n: ");
    scanf("%d", &n);
{
    for (n=0;n<=121;n++)
    {
        printf("%d ", function2(n));
    }
}
    return 0;
}
1

main powinien wyglądać bardziej tak:

int main(void) {
  int n;
  printf("podaj n: ");
  scanf("%d", &n);
  if (n < 0 || 121 < n) {
    printf("ma być z przedziału [0,121] głupku");
  } else {
    for (int i = 0; i <= n; i += 1) {
      printf("%d ", function2(i));
    }
  }
  return 0;
}

ale bez tablicowania wyników pośrednich trwa to bardzo długo :(
Poza tym dla n = 23 przekręca się int. Prawie jak Number 23

1

Pomijając kwestie przekręcania się typu int...

W opisie zadanie nie jest napisane, że masz napisać funkcję zwracającą n-ty wyraz takiego ciągu, tylko

Należy napisać funkcję, która dla liczby naturalnej n będzie wyznaczała, zgodnie 
ze wzorem i wyświetlała n kolejnych wyrazów takiego ciągu: 
a0 = 0, 
a1 = 1, 
an = 2(an-2 + an-1).

Czyli potrzebujesz coś w stylu

void fun(int n)
{
  ... 
  while (...)
  {
    // oblicz an = 2(an2 + an1)
    // wypisz an
    // zaktualizuj an2 i an1
  }
}

Jeśli chcesz to robić rekurencyjnie, to musisz postarać się uniknąć "eksplozji" wywołań rekurencyjnych - tu masz opisane to dla bardzo podobnego przypadku ciągu Fibonacciego

https://guides.codepath.com/compsci/Dynamic-Programming

image

W tym konkretnym przypadku da się tego w miarę łatwo uniknąć - poczytaj o rekurencji "ogonowej" (tail recursion)

0
hubi214 napisał(a):

proszę o podpowiedź jak moglbym to zmienic

int main(void) 
{
int n;
    printf("n: ");
    scanf("%d", &n);
{
    for (n=0;n<=121;n++)
    {
        printf("%d ", function2(n));
    }
}
    return 0;
}

Jak na razie czytasz coś od użytkownika, co natychmiast ignorujesz (for nadpisuje to co zostało wczytane).
Wywal nadmiarowe klamry.
Zastanów się, czy rekurencję można zastąpić czymś innym.

0

Możesz też rozwinąć swój algorytm o możliwość cachowania wyników, co może przyspieszyć jego działanie kosztem zużytej pamięci, o czym warto wiedzieć i umieć zaimplementować.

0
KamilAdam napisał(a):

main powinien wyglądać bardziej tak:

A jeszcze bardziej tak:

int main(void) 
{
    unsigned n;
    printf("podaj n [0..121]: ");
    if((scanf("%u",&n)==1)&&(0<=n)&&(n<=121)) function2prim(n);
    else printf("ma być z przedziału [0,121] głupku\n");
    return 0;
}
void function2prim(unsigned n)
{
    for(unsigned long long a=0,b=1,c;n--,c=2*(a+b),a=b,b=c) printf("%llu",a);
}

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