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

Rekurencja w funkcji błąd wykonania (SIGABRT)

Object Storage Arubacloud
0 głosów
178 wizyt
pytanie zadane 21 grudnia 2016 w C i C++ przez dzialkowiec Nowicjusz (220 p.)
edycja 21 grudnia 2016 przez dzialkowiec

Hej,

Nie wiem dlaczego komplilator SPOJa zgłasza błąd wykonania (SIGABRT) i b.duże zużycie pamięci, jakby rekurencja się zapętlała choć na code blocks wszystko zdaje się działać ok.

Chyba załapałem zastosowanie rekurencji w przypadku funkcji, jednak jak to działa w przypadku procedur. Czy w momencie wywołania rekurencyjnego pierwowzór kończy działanie i kontynuuje pracę tylko jego klon z przekazanymi parametrami do czasu spełniania warunku?

Kawałek kodu z zadania wypisz odwrotność wyrazu:

void wypisz_odwrotnie(string wyraz,int dlugosc)
{
    if(dlugosc>0)
    {
        dlugosc--;
        cout<<wyraz[dlugosc];
        wypisz_odwrotnie(wyraz,dlugosc);
    }
}
int main()
{
...
wypisz_odwrotnie("alamakota",9);
...
}

1 odpowiedź

+1 głos
odpowiedź 27 grudnia 2016 przez d0n Mądrala (6,440 p.)
Cześć, Czy uczyłeś się już o referencjach? Są to "przezwiska" obiektów tworzone za pomocą znaku &. Jeżeli zamienisz w definicji funkcji "string wyraz" na "string& wyraz", to kolejne rekurencyjne wywołania będą działać na tym samym obiekcie. To samo można zrobić z dlugością. Argumentami funkcji przyjmującej referencję nie mogą być stałe, więc wywołanie wypisz_odwrotnie("alamakota", 9); będzie nie możliwe, zamiast tego trzeba stworzyć dwa obiekty, które wyslemy do tego wywołania
komentarz 6 stycznia 2017 przez dzialkowiec Nowicjusz (220 p.)
Cześć!

Super, dzięki za odpowiedź, na obecnym poziomie sam bym tego nie załapał.

Z tego co rozumiem w przypadku zmiennej typu int nie robi różnicy czy przekazujemy ją przez referencję, wszak wskaźnik i liczba zajmują tyle samo pamięci.

Jednak przy stringach korzystniej jest przekazywać przez referencję:

100 wskaźników = 400 bajtów

100 stringów x 100liter = 10000 bajtów

Program na małych stringach działał poprawnie, sędzia na SPOJu musiał użyć jakiejś wartości granicznej i wystąpiło przeciążenie.
komentarz 24 lutego 2017 przez d0n Mądrala (6,440 p.)
Sorry, że długo nie odpisałem, domyślam się, że już sam sobie poradziłeś, ale do rzeczy:
Kolejne wywołania rekurencji tworzą na stosie nowe zmienne, poprzednie wywołanie i jej wszystkie zmienne nadal obowiązują, aż do poprzedniego wywołania wrócimy i funkcja się skończy. To zadanie ci nie wchodzi, bo dużo naturalniejsze jest rozwiązanie iteracyjne (czyli z pętlą for) i ono zabierze dużo mniej RAM'u

Podobne pytania

0 głosów
0 odpowiedzi 265 wizyt
pytanie zadane 16 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
2 odpowiedzi 342 wizyt
pytanie zadane 21 lutego 2018 w C i C++ przez Admin Cpp Początkujący (350 p.)
0 głosów
3 odpowiedzi 778 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez eighty Nowicjusz (190 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...