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

Liczby podzielne przez 2 - rekurencja

+1 głos
1,544 wizyt
pytanie zadane 13 maja 2018 w C i C++ przez periedynek Obywatel (1,320 p.)

Cześć, rekurencje dopiero poznaje. 

Mam za zadanie napsiać funkcje rekurencyjna, ktora sumuje liczby podzielne przez 2.

Nie wiem kompletnie jak sie do tego zabrać, ale napisalem cos takiego:

int sumNumbersDividedBy2(int tab[],int i, int rozmiar, int suma)
{
    if(i==rozmiar)
        return suma+tab[i];
    else if(tab[i]%2==0 && i<rozmiar)
    {
        return sumNumbersDividedBy2(tab,i+1,rozmiar,suma+tab[i]);
    }

}

Mógłby ktoś pomóc co tu jeszcze jest źle?

3 odpowiedzi

+1 głos
odpowiedź 13 maja 2018 przez j23 Mędrzec (195,220 p.)
wybrane 13 maja 2018 przez periedynek
 
Najlepsza
  • linia 1: Funkcja powinna się nazywać sumEvenNumbers :)
  • linia 4: indeksujesz poza dozwolonym rozmiarem tablicy.
  • linia 5: warunek i < rozmiar jest zbędny, on wynika z wcześniejszego ifa.
  • linia 7: funkcja powinna być wywołana niezależnie od tego, czy wartość jest parzysta czy nie (masz przeszukać całą tablicę).
komentarz 13 maja 2018 przez periedynek Obywatel (1,320 p.)

linia 4: Czyli powinno być:

return suma+tab[i-1];

linia 7: w takim razie gdzie mam użyć tego warunku parzystości jak nie tam?

komentarz 13 maja 2018 przez j23 Mędrzec (195,220 p.)

Powinno być: return suma;

Warunek parzystości ma dotyczyć tylko tego, czy liczba ma być dodana do suma. U Ciebie determinuje (także), czy rekurencja ma być kontynuowana - to błąd. Funkcja ma przeszukać całą tablicę, a nie przerwać poszukiwania po napotkaniu liczby nieparzystej.

komentarz 13 maja 2018 przez periedynek Obywatel (1,320 p.)
Rouzmiem.

W takim razie jak zrobić by przeiterowało całą tablicę,a  gdy napotka wlasnie tę parzysta liczbe to ją dodało. Jak pozmieniać te warunki u mnie?
1
komentarz 13 maja 2018 przez j23 Mędrzec (195,220 p.)
if(tab[i] % 2 == 0) suma += tab[i];
return sumNumbersDividedBy2(tab, i + 1, rozmiar, suma);

 

komentarz 13 maja 2018 przez periedynek Obywatel (1,320 p.)
dziekuje
+1 głos
odpowiedź 13 maja 2018 przez jankustosz1 Nałogowiec (37,030 p.)

Można to rozumieć na 2 sposoby:

1) Masz tablicę licz i trzeba zsumować liczby parzyste. Ja tu żadnej rekurencji nie widzę, trzeba się przeiterować przez wszystkie elementy lub ewentualnie zrobić "bezsensowną" rekurencję która będzie przyjmować jako argument 'i' i odpalać się dalej z i-1 jeżeli i jest większe lub równe zero.

2)Zsumować liczby parzyste z danego przedziału, ale tu też rekurencji raczej nie będzie.

Napisałbym coś takiego:

vector<int> liczby;

int suma(int i){
  int sum = 0;
  if(liczby[i] %2 == 0)
      sum += liczby[i];

   if(i >= 1)
       sum += suma(i-1);

   return sum;
}

 

komentarz 13 maja 2018 przez periedynek Obywatel (1,320 p.)
Potrzebuje zrobić rekurencję, mimo że to jest w tym przypadku bez sensu.

Po prostu potrzeubje to zrozumieć, ale na najprostszym przykladzie jakim ja podałem, żadnych jakis wektorów etc.

Mógłbyś powiedzieć co mam u siebie źle?
+1 głos
odpowiedź 13 maja 2018 przez mokrowski Mędrzec (158,960 p.)

Jeśli będziesz sumował od elementu ostatniego do "zerowego", pozbędziesz się jednego if'a.

Tu masz etapy dochodzenia do kodu docelowego. Etap 4 i 5 bym sobie już odpuścił... no ale ... można :)

#include <iostream>
#include <cstddef>

// Poszczególne etapy...

int even_sum1(int * tab, std::size_t size, int sum = 0) {
    --size;
    if(size == 0) {
        if((*tab % 2) == 0) {
            sum += *tab;
        }
        return sum;
    }
    if((tab[size] % 2) == 0) {
        sum += tab[size];
    }
    return even_sum1(tab, size, sum);
}

int even_sum2(int * tab, std::size_t size, int sum = 0) {
    --size;
    sum += ((tab[size] % 2) ? 0: tab[size]);
    if(!size) {
        return sum;
    }
    return even_sum2(tab, size, sum);
}

int even_sum3(int * tab, std::size_t size, int sum = 0) {
    --size;
    sum += ((tab[size] % 2) ? 0: tab[size]);
    return (!size ? sum: even_sum3(tab, size, sum));
}

int even_sum4(int * tab, std::size_t size, int sum = 0) {
    sum += ((tab[--size] % 2) ? 0: tab[size]);
    return (!size ? sum: even_sum3(tab, size, sum));
}

int even_sum5(int * tab, std::size_t size, int sum = 0) {
    return (sum += (tab[--size] % 2) ? 0: tab[size],
            (!size ? sum: even_sum5(tab, size, sum)));
}

int main() {
    int tab[] = { 2, 1, 4, 8 }; // even_sum(...) == 14
    const std::size_t table_size = sizeof(tab) / sizeof(*tab);
    std::cout << even_sum1(tab, table_size) << '\n';
    std::cout << even_sum2(tab, table_size) << '\n';
    std::cout << even_sum3(tab, table_size) << '\n';
    std::cout << even_sum4(tab, table_size) << '\n';
    std::cout << even_sum5(tab, table_size) << '\n';
}

Argument sumy przekaż jako domyślny 0 (zero), wtedy w wywołaniu nie będzie konieczności jego podawania.

Często w takim kodzie stosuje się także operator 3-argumentowy (czyli: .... ? ... : .... )

Podobne pytania

0 głosów
1 odpowiedź 2,162 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez AndekQR Użytkownik (880 p.)
0 głosów
1 odpowiedź 484 wizyt
pytanie zadane 10 stycznia 2023 w C# przez Freak44 Początkujący (300 p.)
0 głosów
1 odpowiedź 1,719 wizyt
pytanie zadane 11 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,322 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.

...