• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rekurencja-jezyk c

Object Storage Arubacloud
0 głosów
998 wizyt
pytanie zadane 27 lutego 2018 w C i C++ przez Ala123456 Użytkownik (760 p.)
edycja 27 lutego 2018 przez Patrycjerz
/* Napisać program znajdujący n-ty wyraz ciągu zadanego rekurencyjnie jako an+2=k an+1 + m an.
Program powinien wczytywać z klawiatury wartości rzeczywiste k, m, a0, a1 oraz całkowite n. */

#include <stdio.h>
int rek(int n, float m,float k,float a0,float a1)
{
if (n==0)
return a0;
if (n==1)
return a1;
else return k*rek(n+1,m,k,a0,a1)+m*rek(n,m,k,a0,a1);
}
int main()
{
    float k,m,a0,a1;
    int n;
    printf ("Program znajdujacy n-ty wyraz ciagu zadanego rekurencyjnie jako a_n+2=k a_n+1 + m a_n. \n ");
    printf ("Podaj wspolczynnik k:\n");
    scanf ("%f",&k);
    printf ("Podaj wspolczynnik m:\n");
    scanf ("%f",&m);
    printf ("Podaj wartosc a0:\n");
    scanf ("%f",&a0);
    printf ("Podaj wartosc a1:\n");
    scanf ("%f",&a1);
    printf ("Podaj liczbe n:\n");
    scanf ("%i",&n);
    printf("%f=%f\n",n, rek(n,m,k,a0,a1));
    	return 0;
}


Czy ktoś pomógłby i sprawdził czemu ten kod nie działa? 

Napisać program znajdujący n-ty wyraz ciągu zadanego rekurencyjnie jako an+2=k an+1 + m an. Program powinien wczytywać z klawiatury wartości rzeczywiste k, m, a0, a1 oraz całkowite n. 

3 odpowiedzi

0 głosów
odpowiedź 27 lutego 2018 przez TenGumis Gaduła (3,440 p.)

Zobacz co się dzieje jak wywołasz funkcję z n równym 10
policzysz wtedy:

k*rek(10+1,m,k,a0,a1)+m*rek(10,m,k,a0,a1)

czyli policzysz an = k* an+1 + m* an

Musisz pamiętać że n wewnątrz funkcji tak naprawdę jest równe n+2 ze wzoru więc wywołania rekurencyjne powinny być dla n-1 i n-2 :

return k*rek(n-1,m,k,a0,a1)+m*rek(n-2,m,k,a0,a1);

Drugą opcją jest przeindeksowanie wzoru na:

an = k* an-1 + m* an-2

co sprowadza się do takiego samego kodu ;)

komentarz 27 lutego 2018 przez Ala123456 Użytkownik (760 p.)
Poprawiłam niestety dalej zle liczy
komentarz 27 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Spróbuj czy działa dla n = 0, następnie dla n = 1, dla n = 2.

Drugi warunek if powinien mieć postać else if.
komentarz 27 lutego 2018 przez Ala123456 Użytkownik (760 p.)
własnie dla n=0 nie działa
komentarz 27 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Trochę namieszałaś, ponieważ niestarannie  napisałaś wzór rekurencyjny, tzn.: n,  n+1,  n+2 powinny być zapisane w indeksie (bo tak się oznacza kolejne wyrazy ciągu). Ty nam podałaś te indeksy jako normalne zmienne równania.

Zaproponuję Ci proste rozwiązanie w postaci szkicu (pseudokodu) w osobnej odpowiedzi, którą zamieszczę poniżej.
0 głosów
odpowiedź 27 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
return k*rek(n+1,m,k,a0,a1)+m*rek(n,m,k,a0,a1);

Do tych wywołań powinno być przekazane kolejno n-1 i n-2 w pierwszym argumencie. Tak jak jest teraz to pewna droga do przepełnienia stosu.

printf("%f=%f\n",n, rek(n,m,k,a0,a1));

%f do wartości typu int?

komentarz 27 lutego 2018 przez Ala123456 Użytkownik (760 p.)
poprawiłam obydwa błedy niestety dalej nie poprawnie liczy
komentarz 27 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Wstaw kod.
komentarz 27 lutego 2018 przez Ala123456 Użytkownik (760 p.)
#include <stdio.h>
int rek(int n, float m,float k,float a0,float a1)
{
if (n==0)
return a0;
if (n==1)
return a1;
else return k*rek(n-1,m,k,a0,a1)+m*rek(n-2,m,k,a0,a1);
}
int main()
{
    float k,m,a0,a1;
    int n;
    printf ("Program znajdujacy n-ty wyraz ciagu zadanego rekurencyjnie jako a_n+2=k a_n+1 + m a_n. \n ");
    printf ("Podaj wspolczynnik k:\n");
    scanf ("%f",&k);
    printf ("Podaj wspolczynnik m:\n");
    scanf ("%f",&m);
    printf ("Podaj wartosc a0:\n");
    scanf ("%f",&a0);
    printf ("Podaj wartosc a1:\n");
    scanf ("%f",&a1);
    printf ("Podaj liczbe n:\n");
    scanf ("%i",&n);
    printf("%i=%f\n",n,rek(n,m,k,a0,a1));
    	return 0;
}

 

komentarz 27 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Jedno %f poprawiłaś, ale drugiego nie. Funkcja rek zwraca inta.
komentarz 27 lutego 2018 przez Ala123456 Użytkownik (760 p.)
nie koniecznie własnie bo uztkownik moze wpisac rzeczywiste wartosci a0 czy a1
komentarz 27 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
int rek(int n, float m,float k,float a0,float a1)

Typ zwracany przez funkcję jest określony w jej deklaracji i w tym przypadku jest to int. To, że przekazujesz do funkcji liczby zmiennoprzecinkowe nie ma żadnego znaczenia.

Jak chcesz zwracać floata, to musisz zmienić typ zwracanej wartości.

komentarz 27 lutego 2018 przez Ala123456 Użytkownik (760 p.)

juz rozumiem i dziala chyba 

/* Napisać program znajdujący n-ty wyraz ciągu zadanego rekurencyjnie jako an+2=k an+1 + m an.
Program powinien wczytywać z klawiatury wartości rzeczywiste k, m, a0, a1 oraz całkowite n. */

#include <stdio.h>
float rek(int n, float m,float k,float a0,float a1)
{
if (n==0)
return a0;
else if (n==1)
return a1;
else return k*rek(n-1,m,k,a0,a1)+m*rek(n-2,m,k,a0,a1);
}
int main()
{
    float k,m,a0,a1;
    int n;
    printf ("Program znajdujacy n-ty wyraz ciagu zadanego rekurencyjnie jako a_n+2=k a_n+1 + m a_n. \n ");
    printf ("Podaj wspolczynnik k:\n");
    scanf ("%f",&k);
    printf ("Podaj wspolczynnik m:\n");
    scanf ("%f",&m);
    printf ("Podaj wartosc a0:\n");
    scanf ("%f",&a0);
    printf ("Podaj wartosc a1:\n");
    scanf ("%f",&a1);
    printf ("Podaj liczbe n:\n");
    scanf ("%i",&n);
    printf("a_n=%f\n",rek(n,m,k,a0,a1));
    	return 0;
}

To jest poprawne?

komentarz 27 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Wygląda ok.
komentarz 27 lutego 2018 przez Ala123456 Użytkownik (760 p.)
Dziękuję bardzo
0 głosów
odpowiedź 27 lutego 2018 przez Beginer Pasjonat (22,110 p.)
float x0 = a0;   // to jest zerowy element ciągu

float x1 = a1;. //to jest pierwszy element ciągu

float x2;  // to jest drugi element ciągu

for (int i = 0; i mniejsze n - 1; i ++)

(

x2 = k x1 + m x0;

x0 = x1:

x1 = x2;

)

P.S. Nadaję z tabletu, tutaj nie mam nawiasów sześciennych, ani znaku mniejszości, musisz je sobie poprawić.

Podobne pytania

0 głosów
2 odpowiedzi 267 wizyt
pytanie zadane 28 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
+1 głos
0 odpowiedzi 134 wizyt
0 głosów
1 odpowiedź 572 wizyt

92,568 zapytań

141,422 odpowiedzi

319,637 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...