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

Liczby podzielne przez 2 - rekurencja

Object Storage Arubacloud
+1 głos
919 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 (194,920 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 (194,920 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 (194,920 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 (35,880 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 (155,460 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ź 1,927 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez AndekQR Użytkownik (880 p.)
0 głosów
1 odpowiedź 201 wizyt
pytanie zadane 10 stycznia 2023 w C# przez Freak44 Początkujący (300 p.)
0 głosów
1 odpowiedź 1,221 wizyt
pytanie zadane 11 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

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

...