• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rekurencja - wartości min oraz max z tablicy

VPS Starter Arubacloud
0 głosów
3,092 wizyt
pytanie zadane 21 kwietnia 2017 w C i C++ przez Jedyn Obywatel (1,200 p.)

Witam. Tak jak w temacie, potrzebuję napisać program wybierający z tablicy min oraz max, musi być on napisany rekurencyjnie. Mój który napisałem wywala mi liczbę minimalną której nie ma w zbiorze (coś typu -8324123). Kod: 

void innyprogram(int *tab, int n, int min, int max)
{
	if(n>0)
	{
		if (min > tab[n-1])
		{
			min = tab[n-1];
		}
		else if (max < tab[n-1])
		{
			max = tab[n-1];
		}
		if (n - 1 >= 1)
		{
			return innyprogram(tab, n - 1, min, max);
		}
	}
	cout << min << " " << max;
	
}


int main()
{
	int *tab, n;
	n = 11;
	tab = new int[n];

	tab[0] = 32;
	tab[1] = 54;
	tab[3] = 9;
	tab[4] = 12;
	tab[5] = 1;
	tab[6] = 323;
	tab[7] = 14;
	tab[8] = 90;
	tab[9] = 234;
	tab[10] = 7;

	innyprogram(tab, n, tab[0], tab[0]);
	char c;
	cin >> c;
    return 0;
}

 

komentarz 21 kwietnia 2017 przez RobertGardzinski Bywalec (2,460 p.)
przywrócone 21 kwietnia 2017 przez RobertGardzinski
Nie zgłębiłem się w kod, ale spróbuj przesłać dwa ostatnie argumenty w funkcji innyprogram przez referencję.

@edit: mój komentarz to bzdura, nie zawracaj sobie głowy
komentarz 21 kwietnia 2017 przez Jedyn Obywatel (1,200 p.)
ok xd
komentarz 21 kwietnia 2017 przez RobertGardzinski Bywalec (2,460 p.)
Głupotę palnąłeś, bo nie zainicjalizowałeś tab[2]
komentarz 21 kwietnia 2017 przez Jedyn Obywatel (1,200 p.)
Ajajaaj no fakt, na szybko chciałem to napisać i wyszedł kwiatek :/. Dzięki wielkie ;)

2 odpowiedzi

+1 głos
odpowiedź 21 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)

1. Tablicę zainicjuj tak a nie takim... czymś co masz.. :

int tab[] = {32, 54, 9, ... 7};

2. Funkcję innyprogram może nazwij sensowniej? Jakieś policzMinMax ?

3. Ta funkcja nie powinna nic "produkować na ekran" tylko policzyć min i max.

4. Warunkiem przerwania rekurencji będzie zmniejszenie n do wartości 0.

5. Radzę wyprowadzić min i max na zewnątrz funkcji i przekazać jako wskaźniki. Czyli:

policzMinMax(int * tablica, size_t wielkosc, int * min, int * max);

6. Nigdy nie inicjuj w 1 linii 2 zmiennych (linia 25 jest wręcz patologicznym przypadkiem bo wbrew pozorom n jest typu int a nie int *)

komentarz 21 kwietnia 2017 przez Jedyn Obywatel (1,200 p.)
1.Deklarując w ten sposób tablicę wywala mi błąd
n = 11;
    tab = new int[n];
    tab[] = { 1,2,3,4,32,14,23,321,52,32,55};
expected an expression

2.Funkcję nazwałem byle jak tylko wstępnie.
3.Tak rozumiem, ale chciałbym zobaczyć efekty funkcji
4.Zgadza się, po prostu kombinowałem i zapomniałem tego zmienić

5.Dałem max i min na zewnątrz, wywala błąd na operatorach (operand types are incopatible ("int*" and "int")
komentarz 21 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)
edycja 21 kwietnia 2017 przez mokrowski

Ad. 1. Popatrz na pkt 1. w moim przykładzie. Te: int tab[] = { ... }; to już jest deklaracja. Nie potrzebujesz tam żadnego new czy int[11]. To mała tablica i możesz ją zmieścić na stosie (nie wołaj new bo to nie ma tu sensu).

Ad 3. Jak przekażesz przez wskaźniki i będziesz ustawiał wartości w funkcji, to efekty zobaczysz poza nią :-)

Można oczywiście napisać to również z użyciem referencji ale nie wiem czy je znasz :-)

Jak naprawdę nie będziesz wiedział jak, zajrzyj. Ale nie przed własnymi próbami:

#include <iostream>
#include <limits>

void calcMinMax1(int * tablica, size_t dlugosc_tablicy, int * min, int * max) 
{
    --dlugosc_tablicy;
    int wartosc = tablica[dlugosc_tablicy];

    if(*min > wartosc)
    {
        *min = wartosc;
    }
    if(*max < wartosc)
    {
        *max = wartosc;
    }
    if(dlugosc_tablicy) calcMinMax1(tablica, dlugosc_tablicy, min, max);
}

void calcMinMax2(int * tablica, size_t dlugosc_tablicy, int &min, int &max)
{
    --dlugosc_tablicy;
    int wartosc = tablica[dlugosc_tablicy];

    min = min > wartosc ? wartosc : min;
    max = max < wartosc ? wartosc : max;

    if(dlugosc_tablicy) calcMinMax2(tablica, dlugosc_tablicy, min, max);
}

int main()
{
    int tablica[] = {234, 1, 32, 54, 9, 12, 323, 14, 90, 234, 7};
    size_t dlugosc = sizeof(tablica) / sizeof(tablica[0]);

    int min = std::numeric_limits<int>::max();
    int max = std::numeric_limits<int>::min();

    calcMinMax1(tablica, dlugosc, &min, &max);
    std::cout << "(1) " << min << ' ' << max << std::endl;

    calcMinMax2(tablica, dlugosc, min, max);
    std::cout << "(2) " << min << ' ' << max << std::endl;
}

Napisałem to prosto + kilka rzeczy które powinieneś wiedzieć :-)

0 głosów
odpowiedź 23 kwietnia 2017 przez Gankkah Użytkownik (720 p.)
Masz funkcję void, a zwracasz coś?

Przecież miałeś nie zwracać!
komentarz 25 kwietnia 2017 przez Jedyn Obywatel (1,200 p.)
Od raz poprawiłem ale + za czujność! :D

Podobne pytania

0 głosów
1 odpowiedź 1,556 wizyt
pytanie zadane 29 maja 2018 w JavaScript przez C1chutki Nowicjusz (120 p.)
0 głosów
5 odpowiedzi 3,095 wizyt
pytanie zadane 10 marca 2018 w C i C++ przez giedymin33 Początkujący (290 p.)
0 głosów
1 odpowiedź 1,238 wizyt
pytanie zadane 19 grudnia 2017 w Java przez Ohnne Nowicjusz (180 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 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!

...