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

Rekurencja, problem ze zrozumieniem.

Object Storage Arubacloud
+1 głos
427 wizyt
pytanie zadane 6 kwietnia 2015 w C i C++ przez Vemp Nowicjusz (210 p.)

Mam problem ze zrozumieniem działania rekurencji. U mnie w liceum (rozszerzona informatyka) nauczyciel niestety zna podstawy podstaw C++ i od niego nic nie mogę się dowiedzieć. 

Podam przykład:

#include <iostream>
using namespace std;

int suma (int a)
{
    if (a<1)
    return 0;



    return a+suma(a-1);
}


int main()
{
    int a;
    cout << "Podaj ilosc liczb naturalnych: ";
    cin >> a;

    cout << "Suma " << a << " liczb naturalnych wynosi: " << suma(a);
    return 0;
}

Nie rozumiem tego w jaki sposób ta funkcja żyje. Jest to program do liczenia sumy a początkowych liczb naturalnych. Na przykład wpiszę 3. Napiszę listę kroków jak ja to rozumiem, a wy mnie poprawcie. 

1. 3 >= 1 więc suma nie zwraca 0

2. zwracana wartość 3+suma(3-1) = 5

3. i dalej co?

No i ja nie rozumiem tego dlaczego ta funkcja się zachowuje jak pętla. Mogłby mi ktoś w liście kroków napisać jak ta funkcja przebiega?

5 odpowiedzi

+6 głosów
odpowiedź 6 kwietnia 2015 przez 001greg001 Bywalec (2,030 p.)
Pan Mirosław Zelent poświecił jeden z swoich filmów temu zagadnienu: http://youtube.com/watch?v=jNi_X5bvmQ
+3 głosów
odpowiedź 6 kwietnia 2015 przez Tomatosoup Pasjonat (18,530 p.)
W 13 odcinku kursu programowania miroslawa zelenta na youtube jest to naprawde dobrze wytlumaczone, zajrzyj
0 głosów
odpowiedź 6 kwietnia 2015 przez elaen Gaduła (4,760 p.)
ta funkcja wywołuje samą siebie, do momentu aż warunek się spełni, potem od końca wypisuje wyniki
0 głosów
odpowiedź 6 kwietnia 2015 przez Dorion300 Szeryf (90,250 p.)
To taka zaawansowana pętla. Jedziemy od 3. Potem 2 potem 1 i gdy jes zero to jest zero. Czyli 3+2+1+0=6
0 głosów
odpowiedź 6 kwietnia 2015 przez marqos12 Obywatel (1,840 p.)

Żeby to łatwo zrozumieć musisz sobie zawsze rozpisywać po kolei co, kiedy i dla czego. W przypadku sumowania "a" pierwszych wyrazów trzeba się zastanowić jaki jest początkowy wyraz. Jest nim liczba 1 więc suma np. 3 pierwszych liczb to 1+2+3=6. Podając funkcji argument podajesz na którym stopniu takiej drabinki stoisz. Poprzedni stopień zawsze jest równy sumie n-1 a obecny (n-1)+n. Żeby obliczyć n-1 musisz spowrotem wywołać funkcje itd.

Moze to troche zagmatwałem ale na przykładzie: Funkcja dostaje argument 3, sprawdza czy jest równy 1 (najmniejszej możliwej wartości/wartości początkowej), jeśli jest to zwraca (return) właśnie tą liczbe czyli w tym przypadku jeden, jeśli nie jest równe 1 to (else) wywołuje samą siebie żeby obliczyć 3-1 czyli jako argument podaje właśnie 2. 

Dla 2 funkcja dalej będzie musiała wywołać samą siebie ale już dla 2-1 czyli 1. Teraz zostaje spełniony warunek (if funkcji) ponieważ 1=1 i funkcja zwraca wartość 1, niby nic ale zwrócona wartość jest podstawiana wyzej ( w lini "else return funkcja(n-1)+n") i zwraca wartość 1+2 czyli 3, zwrócona wartość podstawiona jest wyżej i pętla zwraca końcową wartość czyli 3+3=6 dla trzeciego wyrazu ciągu zaczynajacego się od 1.

int suma ( int a ){
if ( a==1 ) return 1;
else return suma ( a-1 )+a;
}

 

Podobne pytania

+1 głos
4 odpowiedzi 507 wizyt
pytanie zadane 6 stycznia 2016 w C i C++ przez kacperoo7 Nowicjusz (200 p.)
0 głosów
7 odpowiedzi 2,050 wizyt
pytanie zadane 16 września 2015 w Algorytmy przez emSon Stary wyjadacz (10,480 p.)
+1 głos
1 odpowiedź 266 wizyt
pytanie zadane 11 kwietnia 2023 w JavaScript przez jasper93 Obywatel (1,310 p.)

92,617 zapytań

141,467 odpowiedzi

319,783 komentarzy

61,999 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!

...