grzeso Temat założony przez niniejszego użytkownika |
Algorytm szukający pierwszej dodatniej liczby » 2018-01-25 22:29:42 Witam Tworze algorytm wyszukujący pierwszą dodatnią liczbę w zbiorze. Zbiór zawsze posortowany jest rosnąco, liczby mogą się powtarzać. przykładowe dane wejściowe: {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,19} oczekiwany rezultat to: liczba: 2 (jest na 19 miejscu -czyli indeks tablicy to 18) a w zasadzie indeks tej liczby w kodzie są odpowiednio prefiksy 'i' dla indeksów i 'l' dla liczb mój kod: int pierwsza_dodatnia( int * tablica, int i_zero, int i_ostatni ) { int i_granica =( i_zero + i_ostatni ) / 2; int l_granica = tablica[ i_granica ]; int l_zero = tablica[ i_zero ]; int l_ostatni = tablica[ i_ostatni ]; cout << endl << "i_granica " << i_granica; cout << endl << "i_zero " << i_zero; cout << endl << "i_ostatni " << i_ostatni; cout << endl << "l_granica " << l_granica; cout << endl << "l_zero " << l_zero; cout << endl << "l_ostatni " << l_ostatni << endl; if( l_granica < 1 && i_zero != i_granica ) { pierwsza_dodatnia( tablica, i_granica, i_ostatni ); } if( l_granica > 0 && i_zero != i_granica ) { pierwsza_dodatnia( tablica, i_zero, i_granica ); } }
i wszystko pięknie i fajnie, ale na samym końcu po podaniu w main-ie takiej linijki: 4cout << "Pierwsza dodatnia to: " << pierwsza_dodatnia( tablica, 0, 19 ) << endl; wypluwa wynik: 17, czyli indeks liczby na lewo od szukanej moje pytania: 1. nie mam tam returna ani nic innego, czemu coś wypluwa? (wiem że to int a nie void i musi coś wypluć, ale czemu akurat to?) 2. może ma ktoś pomysł jak zrobić żeby wypluwał indeks pierwszej dodatniej liczby (czyli tej szukanej) |
|
geceves |
» 2018-01-25 22:50:15 A gdzie return ? Ciesz się, że nie wypisało 'Hello World' :) |
|
grzeso Temat założony przez niniejszego użytkownika |
» 2018-01-25 22:56:40 no właśnie specjalnie nie ma, a pomimo to coś jest wypisywane z returnem mam problem, bo jak go umieszczę w kodzie to wypisywana jest pierwsza wartość przypisana zmiennej, a funkcja jest rekurencyjna, więć fajnie jakby ostatnia zmienna była wypisana. jeśli zabezpiecze to czymś na zasadzie: if( i_zero != i_granica ) { return i_ostatni; }
to nie działa |
|
geceves |
» 2018-01-25 22:58:56 Skoro no właśnie specjalnie nie ma
|
To jak myślisz, co zwraca Twoja funkcja w tym użyciu? I dlaczego uważasz, że akurat zwraca wynik czegokolwiek? cout << "Pierwsza dodatnia to: " << pierwsza_dodatnia( tablica, 0, 19 ) << endl; Poza tym: więć fajnie jakby ostatnia zmienna była wypisana. |
Dlaczego uważasz, że teraz ją zwraca? |
|
pekfos |
» 2018-01-25 22:59:49 return musi być. Inaczej dostajesz przypadkową wartość. if( l_granica < 1 && i_zero != i_granica ) { pierwsza_dodatnia( tablica, i_granica, i_ostatni ); }
if( l_granica > 0 && i_zero != i_granica ) { pierwsza_dodatnia( tablica, i_zero, i_granica ); }
} |
|
grzeso Temat założony przez niniejszego użytkownika |
» 2018-01-25 23:09:18 doskonale wiem że musi być return, ale nie wiem jak go umieścić żeby było dobrze, dlatego go chwilowo nie umieściłem i chciałem zobaczyć co się stanie.
funkcja zawsze zwraca to samo: indeks szukanej liczby -1 czyli zmienna i_granica lub i_zero (mają te same wartości na końcu) - i zakładam że to przypadek, ale tak jak pisałem wcześniej, nie za bardzo wiem jak zrobić return
prefoks jeżeli żaden z warunków nie został spełniony to funkcja powinna się zakończyć (a przynajmniej tak mi się wydaje)
nie do końca kumam o co chodzi z "Czy ten wynik powinien być zwrócony?"
wynikiem działania funkcji powinna być zmienna i_zero zawierająca indeks pierwszej liczby większej od zera
|
|
pekfos |
» 2018-01-25 23:13:54 nie do końca kumam o co chodzi z "Czy ten wynik powinien być zwrócony?"
wynikiem działania funkcji powinna być zmienna i_zero zawierająca indeks pierwszej liczby większej od zera |
Więc pewnie chcesz tą wartość zwrócić. Wychodzisz wtedy z wywołania rekurencyjnego do poziomu wyżej, gdzie masz 2 wywołania rekurencyjne w warunkach, które nie wykluczają się wzajemnie. Masz wtedy z wywołań rekurencyjnych od zera do dwóch wyników. Co zwrócisz wtedy? //edit: A jednak się wykluczają, z jakiegoś powodu myślałem o floatach. Istnieje else, wiesz.. Wtf, takiej wersji jeszcze nie było. |
|
geceves |
» 2018-01-25 23:24:27 @grzeso, rozmawianie o tej funkcji bez instrukcji return , nie ma żadnego sensu, wynik akurat dla Ciebie jest powtarzalny ale to wynika jedynie z tego jak kompilator zbudował ten kod. Jeżeli chcesz mieć pewność co do zwracanego wyniku to musisz go zwrócić poprzez return , inaczej zwracana wartość jest niezdefiniowana. Musisz określić warunek końca rekurencji i przy napotkaniu tego warunku wykonać return . Przede wszystkim zastanów się też czy podejście rekurencyjne ma tutaj sens, czy może jest wymyślane na siłę. |
|
« 1 » 2 |