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

Liczby podzielne przez 2 - rekurencja

VPS Starter Arubacloud
+1 głos
881 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,918 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez AndekQR Użytkownik (880 p.)
0 głosów
1 odpowiedź 194 wizyt
pytanie zadane 10 stycznia 2023 w C# przez Freak44 Początkujący (300 p.)
0 głosów
1 odpowiedź 1,215 wizyt
pytanie zadane 11 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...