• 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)

VPS Starter Arubacloud
0 głosów
177 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 257 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 324 wizyt
pytanie zadane 21 lutego 2018 w C i C++ przez Admin Cpp Początkujący (350 p.)
0 głosów
3 odpowiedzi 748 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez eighty Nowicjusz (190 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!

...