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

Rekurencja cpp

+3 głosów
673 wizyt
pytanie zadane 18 kwietnia 2015 w C i C++ przez victis Początkujący (490 p.)
Jak napisać rekurencyjnie kod, który będzie zwracał sumę liczb podzielnych przez 2?

3 odpowiedzi

+5 głosów
odpowiedź 18 kwietnia 2015 przez achilles147 Dyskutant (9,580 p.)
edycja 18 kwietnia 2015 przez Harsay
 
Najlepsza
int sumaRekurencji(int liczba)
{
	int suma=0;
	if(liczba>0)
	{
		if(liczba % 2 == 0)
		{
			suma += liczba + sumaRekurencji(liczba-1);
		}
		else
		{
			suma += sumaRekurencji(liczba-1);
		}
	}
	return suma;
}

 

komentarz 18 kwietnia 2015 przez victis Początkujący (490 p.)
Dzięki wielkie!
0 głosów
odpowiedź 18 kwietnia 2015 przez Szahid Pasjonat (20,970 p.)
Co oznacza rekurencyjnie?
komentarz 18 kwietnia 2015 przez Harsay Pasjonat (23,640 p.)
Funkcja wywłouje samą siebie, aż do osiągnięcia upragnionego efektu. Zastępuje rozwiązania iteracyjne. Zazwyczaj takie rozwiązanie jest krótsze w zapisie ale mniej wydajne.
komentarz 18 kwietnia 2015 przez Wally Bywalec (2,840 p.)
No i niekiedy rekurencja jest niezastąpiona. Na przykład usuwanie drzewa BST.
0 głosów
odpowiedź 18 kwietnia 2015 przez lrk Początkujący (300 p.)

Rekurencja oznacza odwołanie się funckji do samej siebie.

W kodzie nie możemy zapomnieć o warunku, który zakończy odwoływanie się funkcji do samej siebie (w przykładzie jets to if(liczba>0) ) ponieważ jeżeli o tym zapomnimy to funkcji będzie się cały czas zapętlać aż do momentu kiedy przekroczymy zakres naszej zmiennej (np. dla long double jest to zakres od -1,1 × 10^4932 do 1,1 × 10^4932 - polecam poczytać o reprezentacji liczb zmiennoprzeciwnkowych)

Przykład rekurencji dla programu, który zlicza sumę liczb z danego przedziału:

double suma(int poczatek, int koniec){

    double wynik = 0;

    if(poczatek <= koniec)
    {
        wynik = poczatek + suma(poczatek+1, koniec);
    }
    
    return wynik;
}
int main()
{
    cout << suma(1,3);
}

Aby lepiej wyobrazić sobie o co chodzi, możemy skompilować kod tylko w warunku if zmieńmy suma(poczatek+1, koniec) na suma(poczatek, koniec). Wtedy program się zapętli i cały czas będzie wchodził do if, nigdy nie dojdzie do warunku kiedy poczatek > koniec ponieważ zmienna poczatek nie zostaje zwiększana.

Wywołanie rekurencyjne powyższego kodu dla suma(1,3) działa następująco:

wynik = (1 + suma(2,3) )

wynik = (1 + (2 + suma(3,3)) )

wynik = (1 + (2 + (3) ) )

tutaj już warunek nie zostaje spełniony bo poczatek jest większy niz koniec, więc lecimy do return wynik i zwracamy:

wynik = 6

Podobne pytania

0 głosów
0 odpowiedzi 600 wizyt
pytanie zadane 26 kwietnia 2021 w C i C++ przez anteq69 Początkujący (260 p.)
0 głosów
1 odpowiedź 526 wizyt
pytanie zadane 20 maja 2023 w C i C++ przez Igaiga Nowicjusz (120 p.)
–1 głos
1 odpowiedź 618 wizyt
pytanie zadane 14 listopada 2020 w C i C++ przez marofx Nowicjusz (120 p.)

93,720 zapytań

142,648 odpowiedzi

323,266 komentarzy

63,270 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...