Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

MangustaKing

Rekurencja zwracająca najmniejszą wartośc z tablicy w języku C++

Polecane posty

Mam problem z funkcją rekurencyjną, która wyświetla najmniejszą wartość w tablicy. Najprawdopodobniej tą funkcję da się zapisać: krócej, optymalniej, łatwiej, ale ten kod osobiście sam wymyśliłem wiec proszę tylko o wskazówki które mi podpowiedzą jak poprawić mój program, tak aby poprawniej działał.

PS. Próbowałem różnych sposobów zapisu tej funkcji i ostatecznie zatrzymałem się na tym, bo inne warianty tego zapisu nie dawały poprawnego wyniku, a przeważnie wyświetlały mi zero, jako wynik.


#include<iostream>
#include<cstdlib>
using namespace std;
// funkcja typu void która wprowadza do tablicy dynamicznej wartosci podane przez uzytkownika
void wczytaj(int &n, int tab[])
{
for (int i=0;i<n;i++)
{
cout<<"Wprowadz element: ";
cin>>tab[i];
}
}
//funkcja rekurencyjna wzracająca najmniejsza wartosc z tablicy
int wyszukaj_min(int n, int tab[], int pom=0)
{
if(n<0)
return pom;
else if(tab[n] < pom)
{pom=tab[n];
return wyszukaj_min(n-1,tab,pom);
}
else
return 0;
}

int main()
{
int n=0,pom;
cout<<"Podaj n: ";
cin>>n;
int tab[n];
wczytaj(n,tab);
cout<<wyszukaj_min(n,tab,pom);
system("pause");
return 0;
}

Link do komentarza
Udostępnij na innych stronach

Zgodnie z Twoją prośbą pominę narzekania na sens istnienia takiej funkcji, przyczepię się więc w pierwszej kolejności do niekompilowalności obecnego kodu - zapis


int tab[n];

jest niepoprawny, jeżeli n jest zmienną, a nie stałą.

Nie wiem też po co jako pierwszy parametr funkcji wczytaj podajesz referencję do obiektu, a nie samą wartość.

Co do samej funkcji wyszukaj_min, to nie bardzo rozumiem, czemu czasami ma ona zwracać 0 - pierwszy warunek w zupełności wystarcza na odpowiednie zakończenie rekurencji. A że zmienna pom ma posiadać najmniejszą wartość w tablicy z przedziału <n, rozmiar tab), to końcówkę funkcji przerobiłbym na coś w stylu:


(...)
else if(tab[n] < pom)
{
pom=tab[n];
}
return wyszukaj_min(n-1,tab,pom);

No i ostatnia kwestia to przekazywane na początku parametry - przekazywanie niezainicjowanej zmiennej nie ma zbytniego sensu, zamiast tego warto przekazać ostatni element tablicy (a więc pierwszy w kolejce do sprawdzenia). Czyli wywołanie będzie miało postać:


wyszukaj_min(n-2,tab,tab[n-1])

tab[n-1] to ostatni element tablicy, natomiast n-2 to indeks ostatniego nieprzetworzonego jeszcze elementu.

Link do komentarza
Udostępnij na innych stronach

Stosuj jakieś formatowanie kodu, bo to, co piszesz jest nieczytelne. Przy czymś bardziej złożonym stracisz masę czasu na szukanie ew. problemu. Nawiasów klamrowych w pętlach czy instrukcjach warunkowych też nie unikaj - inaczej ułatwisz sobie tylko popełnienie błędu.

Link do komentarza
Udostępnij na innych stronach

przyczepię się więc w pierwszej kolejności do niekompilowalności obecnego kodu - zapis

int tab[n];

jest niepoprawny, jeżeli n jest zmienną, a nie stałą.

A gucio, bo to jest w pełni poprawne i zgodne ze standardem. Choć wypadałoby być świadomym, że tak alokowane tablice potrafią się bardzo paskudnie zemścić. Także w żadnym razie nie zachęcam do stosowania.

Prosisz o rady jak kod usprawnić.

Po pierwsze kod pisze i dokumentuje się w jednym języku. Ponieważ wszystkie słowa kluczowe i cała biblioteka standardowa jest po angielsku, to jedynym słusznym językiem jest angielski.

Po drugie nie popełniaj błędów językowych, vide "wzracająca".

Po trzecie, korzystaj z dobrodziejstw biblioteki standardowej. Potrzebujesz tablicy o zmiennym rozmiarze? int tab[n] to koszmarna pomyłka. Lepiej byłoby zrobić tak:

std::vector<int> tab(n);

Po czwarte pętla byłaby zdecydowanie lepszym wyborem:

int min = *std::min_element(tab.begin(), tab.end());

Link do komentarza
Udostępnij na innych stronach

Przypuszczam, że na zajęciach dostał zadanie, by zrobić to rekurencyjnie (beznadziejny pomysł, ale cóż...).

Poza tym, co napisał webtom warto zastanowić się jaka jest wartość pom przy pierwszym wejściu do funkcji wyszukaj_min().

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...