rekurencja (przepełnienie bufora/ stostu ?)

0

witam

mam następujący problem z rekurencją:
napisałem program do rozwiązywania SUDOKU, użyłem rekurencji z powrotami (metoda samego wyliczania wartości w danym polu jest podobna do tej opisanej w wikipedi http://pl.wikipedia.org/wiki/Sudoku jako "metoda 2").

O razu zaznaczam, że jedno wywołanie funkcji wywołuje tylko jedną jej kopię (więc do przepełnienia stosu nie powinno chyba dojść)

Wszystko spoko, program działa prawidłowo, rozwiązuje plansze sudoku i zapisuje rozwiązania do pliku ale działa tylko dla stosunkowo prostych plansz, gdy chce rozwiązać jakąś trudniejszą plansze, program sam się po chwili wyłącza i nie ma rozwiązania :/

Zrobiłem licznik liczący ile razy funkcja licząca została wywołana i zauważyłem, że dzieje się tak w przypadkach, gdy program funkcję uruchomi więcej niż około 57900 razy... (a dokładnie wysypuje się przy 57908 ;] ) plansza średniej trudności potrzebuje od paru tysięcy do 40 000 (te trudniejsze trochę) wywołań funkcji

moje pytanie jest następujące:
czy jest możliwe, żeby komputer nie umiał wydolić przy takich dużych ilościach wywołań funkcji ?
czy może nastąpić jakieś przepełnienie czy coś w tym stylu ?

nie jestem pewien czy wina leży po mojej stronie (błędy w kodzie) czy też obrana przeze mnie metoda jest tak mało wydajna i tak już musi po prostu być :d

jeśli to ma jakieś znaczenie to używam Dev C++ 4.9.9.2

trochę się rozpisałem ale mam nadzieję, że dokładnie przedstawiłem mój problem. nie zamieszczam kodu samego programu bo trochę dużo tego jest, istotna wydaje mi sie sama zasada działania programu którą opisałem. zresztą jak już pisałem, program działa, wysypuje się tylko na zbyt trudnych planszach ;-)

z góry dzięki za każdą pomoc lub ewentualne odesłanie mnie do innej strony gdzie ten problem został już opisany (jakoś nie umiałem znaleźć)

0

no tak dokładnie, masz zbyt głębokie zagnieżdżenie rekurencji i stosu brakuje. Masz dwie opcje:

  • zmienić rozmiar stosu, poszukaj w dokumentacji narzędzi gcc, program ld (to jest linker)
  • zrobić "własną" rekurencję, odkładając dane na własnym stosie i zamiast wywoływać funkcję rekurencyjnie, to iteracyjnie z tego stosu czytać/wstawiać odpowiednie informacje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1