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

question-closed Wywołanie funkcji rekurencyjnej dla skróconego wektora

42 Warsaw Coding Academy
0 głosów
233 wizyt
pytanie zadane 13 stycznia 2021 w C i C++ przez Pelo Użytkownik (520 p.)
zamknięte 14 stycznia 2021 przez Pelo

Dobry wieczór. Mam za zadanie stworzyć program, który rekurencyjnie obliczy sumę liczb z wektora. Chciałem, aby funkcja zwracała ostatnią liczbę w wektorze i start tej samej funkcji na wektorze krótszym o 1 liczbę. Niestety program zwraca błąd: invalid use of void expression. Z góry dziękuję za pomoc w rozwiązaniu problemu.


#include <iostream>
#include <vector>

using namespace std;

int sumaWyrazow (vector<int>liczby) {
    if(liczby.size() == 1) {
        return liczby.back();
    }

    return liczby.back() + sumaWyrazow(liczby.pop_back());
}

int main() {
    vector<int>liczby{1,6,-2};

    cout <<sumaWyrazow(liczby);

    return 0;
}

 

komentarz zamknięcia: problem rozwiązany
2
komentarz 13 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
edycja 13 stycznia 2021 przez NewEraOfPeace

Typ zwracany metody pop_back to void (choć technicznie rzecz biorąc to nie typ), a funkcja przyjmuje vector intów.

1 odpowiedź

+1 głos
odpowiedź 13 stycznia 2021 przez tmar1212 Bywalec (2,600 p.)
wybrane 13 stycznia 2021 przez Pelo
 
Najlepsza

C++ nie ma tail/rest na wektorze można ją nieefektywnie zasymulować:

int sumaWyrazow (vector<int>liczby) {
    if(liczby.size() == 0) {
        return 0;
    }
    return liczby[0] + sumaWyrazow(std::vector<int>(liczby.begin() + 1, liczby.end()));
}

Lepiej byłoby przekazywać jeszcze indeks do funkcji, (złożoność się poprawi, liniowa, a nie jak powyższy kwadratowa):

int sumaWyrazow1(std::vector<int> liczby, int i) {
  if (i == liczby.size())
    return 0;
  return liczby[i] + sumaWyrazow1(liczby, i + 1);
}

 

komentarz 14 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)

Warto jeszcze pamiętać o tym,  aby pierwszy argument funkcji sumaWyrazow1 był przekazywany przez referencję, co w przypadku tego typu rekurencji ma kolosalne znaczenie w zmniejszeniu narzutu pamięciowego i czasowego.

int sumaWyrazow1( const std::vector<int>& liczby, int i)

 

Podobne pytania

0 głosów
1 odpowiedź 1,300 wizyt
pytanie zadane 23 stycznia 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
+1 głos
2 odpowiedzi 1,776 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez kubal0101 Początkujący (280 p.)
0 głosów
1 odpowiedź 1,148 wizyt
pytanie zadane 24 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,420 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...