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

Rekurencja-jezyk c

VPS Starter Arubacloud
0 głosów
1,198 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 335 wizyt
pytanie zadane 28 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
+1 głos
0 odpowiedzi 148 wizyt
0 głosów
1 odpowiedź 640 wizyt

92,963 zapytań

141,929 odpowiedzi

321,162 komentarzy

62,298 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...