Wykrycie błędu funkcji [C] - początkujący

0

Witam serdecznie,
zwracam się z zapytaniem o pomoc, w sprawie błędu, którego nie mogę wyłapać.

Mianowicie zaczynam naukę języka C na własną rękę. Pożytkuję się obecnie książką, która to wprowadza w podstawy programowania.
Treść zadania dosłownie mówi o tym, aby przekonać się o niedziałaniu funkcji, i spróbować ją naprawić. Niestety nie mam bladego pojęcia co jest nie tak...
Czy mógłbym prosić o pomoc w wykryciu problemu, ewentualnie naprowadzenie / wyjaśnienie co on robi?
Niżej podany kod wyświetla dosłownie '-1' do momentu wyrzucenia błędu o naruszeniu struktur pamięci.
Natomiast powinien zwracać rekurencyjnie wyniki zgodnie z formułą.
'Podzielna przez 2 -> funkcja(n/2)' jeżeli nie funkcja(2n+1);

int f(int n){
printf("%d \n",n);
if (n%2==0) return f(n/2);
else
return f(2*n+1);
return 0;
} 
3

Używanie wcięć w kodzie nic nie kosztuje, a drastycznie poprawia czytelność…

Jeśli dobrze widzę (a mogę źle widzieć, bo nie ma wcięć), to ta funkcja zwraca wywołanie f(n/2) dla n parzystych i f(2*n + 1) dla n nieparzystych, co oznacza, że zawsze będzie zwracała wywołanie do samej siebie — ta rekurencja nie ma nigdzie końca.

1

@Ccrocc masz tutaj if -> return, else -> return, czyli to twoje "return 0" na końcu nigdy sie nie wykona. Czyli ZAWSZE wywołujesz znów f(cośtam). Robisz kupę wywołań rekurencjnych az kończy się stos.

0
Althorion napisał(a):

Używanie wcięć w kodzie nic nie kosztuje, a drastycznie poprawia czytelność…

Jeśli dobrze widzę (a mogę źle widzieć, bo nie ma wcięć), to ta funkcja zwraca wywołanie f(n/2) dla n parzystych i f(2*n + 1) dla n nieparzystych, co oznacza, że zawsze będzie zwracała wywołanie do samej siebie — ta rekurencja nie ma nigdzie końca.

Rozumiem, właśnie tu polega problem. Widziałem, że się wywołuje bez końca - jednak nie rozumiem dlaczego zwraca ciągle '-1' do momentu "Naruszenia struktur pamięci" .

0
Shalom napisał(a):

@Ccrocc masz tutaj if -> return, else -> return, czyli to twoje "return 0" na końcu nigdy sie nie wykona. Czyli ZAWSZE wywołujesz znów f(cośtam). Robisz kupę wywołań rekurencjnych az kończy się stos.

Ach, więc dlatego jedzie z '-1' do momentu gdy kończy mi się pole manewru :)
Dziękuję serdecznie :)

1

Bo może. Nie jest nigdzie powiedziane, co ma się wydarzyć, gdy braknie stosu. Program zakłada, że to się nigdy nie stanie, więc gdy jednak się to wydarzy, efekty mogą być rozmaite i nie do końca przewidywalne. Jak chcesz zrozumieć dlaczego konkretnie tak, to musisz sobie to skompilować do asma i tam przeczytać.

Swoją drogą, ten program nie zwraca -1, on to wypisuje na ekran — to jest dosyć spora różnica.

0

Ta funkcja działa tak że jeżeli liczba jest parzysta to ją podzieli przez 2, jeżeli nie to pomnoży przez 2*n + 1 co w konsekwencji da większą liczbę nieparzystą i tak to będzie sobie leciało aż do nieskończoności a przynajmniej powinno gdyby nie ograniczenia, pierwsze przepełnienie stosu przez co program się wywala, drugie pojemność samego int który według tego: https://pl.wikipedia.org/wiki/Liczba_całkowita_(typ_danych) może zapisać maksymalną liczbę równą 2 147 483 647, jeżeli próbujemy wstawić do int większą wartość to w zasadzie nie wiem co się dzieje, ale najwyraźniej jest tam taki zapis który funkcja wypisująca na ekran interpretuje jako -1.

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